Abfrage mit SUM und GROUP BY über zwei Tabellen

ukyo184

Mitglied
Hallo an alle Hilfsbereiten,

ich habe ein Problem bei einer Abfrage bei der ich SUM und GROUP BY benutzen muss (zumindest denke ich das :) ) . Ich habe hier im Forum zwar schon nach entsprechenden Beiträgen gesucht die mir eine Lösung näherbringen und nichts gefunden aber falls ich eine nützliche Hilfe übersehen haben sollte, wäre ich für einen Link zu dem entsprechenden Beitrag auch dankbar.

Also es geht um folgendes:

Tabelle Personal mit Spalten Personalnummer, Nachname, Vorname
Tabelle Stunden mit Spalten Personalnummer, Jahr, Monat, Gleitzeitsaldo

Beide Tabellen sind über die Personalnummer miteinander verknüpft. Ich muss jetzt eine Abfrage erstellen, in der die Personalnummer, Nachname, Vorname und die jeweilige Summe des Gelitzeitsaldos pro Mitarbeiter ausgegeben wird. Ich hab das mal so probiert:

Code:
   SELECT p.personalnr, p.nachname, p.vorname, sum(s.gleitzeitsaldo) 
   FROM personal p, stunden s 
   GROUP BY p.personalnr 
   HAVING p.personalnr = s.personalnr 
   ORDER BY p.nachname

Kann mir bitte jemand sagen was ich falsch mache oder auch welche Abfrage geeigneter wäre? So wie ich das ausprobiert habe, funktioniert es leider nicht. *grmpf*

Danke im voraus für jede Hilfe.

Gruß Ukyo
 
Der Join in der HAVING-Klausel ist wohl falsch.

Aber, verflixt, meine schöne Kristallkugel scheint ne Macke zu haben. Die weiß
schon wieder nicht welches RDBMS Du benutzt.
Vielleicht muß ich doch mal auf http://www.hellsehen.de nachfragen!

Meistens werden im Group By Teil auch alle Spalten des Selects erwartet,
und der Join-Vergleich steht in der WHERE-Klausel.
Ungetestet und auch schon mitten in der Nacht: mein Vorschlag wäre so:

SELECT p.personalnr, p.nachname, p.vorname, sum(s.gleitzeitsaldo)
FROM personal p, stunden s
WHERE p.personalnr = s.personalnr
GROUP BY p.personalnr, p.nachname, p.vorname
HAVING sum(s.gleitzeitsaldo) >= 1
ORDER BY p.nachname

Vielleicht wird Dir damit auch die Bedeutung von HAVING klar, obwohl Du das wahrscheinlich für Deine Fragestellung gar nicht brauchst.
 
Code:
   SELECT p.personalnr, p.nachname, p.vorname, sum(s.gleitzeitsaldo)  AS SumGZeit
   FROM personal AS p LEFT JOIN stunden AS s
   ON p.personalnr = s.personalnr
   GROUP BY p.personalnr, p.nachname, p.vorname
   ORDER BY p.nachname

Laut SQL Standard werden alle Aliase durch das Schlüsselwort AS eingeleitet.
Also <feldname> AS <NeueFeldbezeichnung>, bei Tabelle genauso.

Ausserdem müssen bei einer Gruppierung immer alle Felder die nicht in einer Aggregatfunktion verwendet werden, in der GROUP BY Klausel aufgeführt werden müssen.
 
mschuetzda hat gesagt.:
Bei Oracle z.B. ist das ein "kann" aber kein "muß". Und wir wissen nicht, welche DB der TO benutzt. ;)
Hi,

als aller erstes Mal vielen Dank für die schnelle Hilfe. Die Abfrage hat gleich wie gewollt funktioniert.

Zur DB ... ich war mir gestern nicht mehr 100% sicher welche Version des Interbase SQL-Servers wir in der Firma im Einsatz haben. Daher habe ich mich damit zurückgehalten. Ich habe heute noch einmal nachgeschaut und gesehen, dass es Interbase SQL Server 5.5 ist auf der unsere Datenbankanwendung aufsetzt.

War es das was ihr wissen wolltet, oder?

Gruß Ukyo
 
War es das was ihr wissen wolltet, oder?

Ja, denn es gibt eine ganze Reihe SQL-Dialekte und deshalb ist es besser, wenn man gleich das RDBMS bei der Frage gleich mit angibt. Ich habe z.B. das AS bei Oracle noch nie benutzt und wußte auch nicht, dass man es bei anderen Dialekten benutzen muß.

Egal, schön, dass die Tipps geholfen haben.
 

Neue Beiträge

Zurück