Announcement

Collapse
No announcement yet.

SQL- Abfrage: Brauche Hilfe

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • SQL- Abfrage: Brauche Hilfe

    Hallo,

    mein erster Post

    Das Forum, werde ich wohl noch öfters gebrauchen können.

    Ich habe eine SQL- Abfrage vor, die ich jedoch momentan leider nicht alleine hin bekomme. Auch googlen nach dem Thema war erfolglos, da ich nicht ausdrücken kann welche SQL- Funktionalität ich für diese Art von Abfrage brauchen werde.

    Zur Situation:

    Ich habe 4 Tabellen:

    - Auftrag
    - Leistungen
    - Personal
    - Zeit

    Nun sollte ich Folgendes Ergebnis erhalten:
    Für ein bestimmten Namen (Personal) Alle Leistungen (diese werden Auftragsbezogen geholt, da die Auftragsnr, mit den Leistungen verknüpft ist und diese werden summiert) zu einem Bestimmten Datum und dazu die + Zeit (Arbeitszeit von / bis) für dieses Datum.

    D.h. ein mögliches Ergebnis sieht folgendermaßen aus:

    arbeits_beginn arbeits_ende Stunden langbez132
    ----------------------- ----------------------- ------------------------ ------------------------------------------------------------------------------------------------------------------------------------
    2009-06-08 06:20:00.000 2009-06-08 16:43:00.000 7.5 Max Mustermann

    Diese Daten erhalte ich ohne Probleme, nun habe ich jedoch evtl. ein Arbeitsbeginn um 07:00 Uhr ein Arbeteitsende um 12:00 (Mittagspause) und einen weiteren AB um 13:00 und ein AE um 18:00. So wird mir bei meiner Abfrage lediglich die letzte Zeitbuchung genommen also 13:00 - 18:00 Uhr. Wie kann die das vermeiden und beide Buchungen anzeigen lassen? Entweder Untereinander oder sogar in Extra Spalten, falls 2 Buchungen vorgenommen wurden.

    Ich hoffe Ihr könnt nachvollziehen was ich meine, anbei noch die SQL Abfrage (Etwas Angepasst)
    Code:
    SELECT    zeit.arbeits_beginn, zeit.arbeits_ende, SUM(leist.stunden_arbeit) AS Stunden,  personal.name
    FROM         auft INNER JOIN
                          leist ON auft.serv_belegnr = leist.serv_belegnr INNER JOIN
                          zeit ON auft.persnr = zeit.persnr INNER JOIN
                          personal ON zeit.persnr = personal.persnr
    WHERE     (zeit.arbeits_beginn >= '28.04.2009') AND (zeit.arbeits_ende <= '29.04.2009')
    GROUP BY zeit.arbeits_beginn, zeit.arbeits_ende, leist.leistungsart, leist.leistungsdatum, personal.name, auft.auftragsart
    HAVING      (leist.leistungsdatum = '28.04.2009') AND (personal.name LIKE N'%Mustermann%') AND 
                          (auft.auftragsart = 'XY01') AND (leist.leistungsart = '1')
    Vielen Dank für jede Hilfe.

    Freundliche Grüße,
    GNewmann

  • #2
    Hallo GNewmann,
    ich verstehe nicht, warum du eine Summe bildest und die GROUP BY-Klausel verwendest. Wenn du die Zeiten einzeln aufgelistet haben willst, passt das doch nicht zusammen.
    Du hast geschrieben, du brauchst alle Leistungen zu einer Person und einem Datum. Wenn du die Summe der Stunden aus der Tabelle leist brauchst und dazu alle Zeiten einzeln, musst du eine Unterabfrage verwenden. Vielleicht so:
    Code:
    SELECT    zeit.arbeits_beginn, zeit.arbeits_ende, sum_l.Stunden,  personal.name
    FROM    auft INNER JOIN
                     (SELECT serv_belegnr, SUM(leist.stunden_arbeit) AS Stunden FROM leist 
                          WHERE leistungsdatum = '28.04.2009' AND (leist.leistungsart = '1') 
                          GROUP BY serv_belegnr) as sum_l ON auft.serv_belegnr = sum_l.serv_belegnr
                 INNER JOIN  zeit ON auft.persnr = zeit.persnr
                 INNER JOIN  personal ON zeit.persnr = personal.persnr
    WHERE     (zeit.arbeits_beginn >= '28.04.2009') AND (zeit.arbeits_ende <= '29.04.2009') AND  (personal.name LIKE N'%Mustermann%') AND 
                          (auft.auftragsart = 'XY01')
    Ob das funktioniert, weiß ich nicht. Ich hab's nicht getested. Aber vielleicht ist es eine Anregung zum Nachdenken.
    Ich nehme an, die fest eingetragenen Daten werden durch ein Programm jeweils modifiziert.
    Zuletzt editiert von Wiedehopf; 17.06.2009, 16:05.

    Comment


    • #3
      Hallo Wiedehopf,

      danke für die ausführliche Hilfe..

      Ich bekomme jedoch folgende Fehlermeldung:

      Msg 4104, Level 16, State 1, Line 1
      Der mehrteilige Bezeichner "leist.stunden_arbeit" konnte nicht gebunden werden.

      Da dieser im SQL Statement 2 x vorkommt.

      Ich werde mir die Abfrage noch genauer anschauen und sie anpassen, an sich scheint der weg schonmal sehr gut zu sein, ist jedoch momentan nur die Frage, wenn ich eine Unterabfrage ausführe, wie ich die Aggregatfunktion bzw. das Ergebnis in die Übergeordnete Abfrage ohne diese Fehlermeldung bringe.

      Danke & Grüße,
      GNewmann

      Comment


      • #4
        Hallo GNewmann,
        mit welchem Datenbanksystem arbeitest du eigentlich? Davon hängen ja die Fehlermeldungen und teilweise auch die Syntax ab.
        Probier mal die Unterabfrage allein aus.
        Das Prinzip ist, dass die Unterabfrage wie eine Tabelle behandelt wird.

        Comment

        Working...
        X