Rechnung in SQL Abfrage?
Hallo zusammen,
ich lerne gerade für meine Abschlussprüfung und bin gerade an einer Aufgabe die mich ein wenig grübeln lässt. Es sollen SQL-Abfragen erstellt werden und ich bin mir nun unentschlossen ob ich in diesem Fall ein SUM() nutzen sollte oder ob das ohne geht...Um die Frage besser zu verstehen, gebe ich euch ein Relationenmodell vor und meine zwei möglichen Lösungen.
Artikel (Artikel_ID, ArtikelName, Verkaufspreis, Einkaufspreis)
Filiale ( Filal_ID, FilialeName)
Verkauf ( Filiale_ID, Artikel_ID, Menge, Datum)
Aufgabe lautet:
Wie viel Umsatz wurde in jede einzelne Filiale im Februar 2016 gemacht?
Mein Lösung:
SELECT f.Filiale_ID, f.FilialeName, a.Verkaufspreis * v.Menge AS Umsatz
...
Vorgegebene Lösung:
SELECT f.Filiale_ID, f.FilialeName, SUM(a.Verkaufspreis * v.Menge) AS Umsatz
...
Welches von den beiden ist nun richtig? Oder können beide so funktionieren? '^^
Vielen Dank im Voraus! :)
1 Antwort
Das SUM() brauchst du, weil du ja nicht die einzelnen Buchungen haben willst, sondern die Summe aller Buchungen in einem bestimmten Zeitraum (WHERE), zusammengefasst nach Filialien (GROUP BY).
SELECT f.Filiale_ID, f.FilialeName, SUM(a.Verkaufspreis * v.Menge) AS Umsatz FROM ... WHERE MONTH(Datum)=2 AND YEAR(Datum)=2016 GROUP BY f.Filiale_ID, f.FilialeName
Das GROUP BY sorgt dafür, das Einträge mit gleicher Fililale_ID und FilialeName zusammengefasst werden. Diese zusammengefassten Einträge sind aber nun mehrere Zeilen (Pro Filialie kann es mehrere Buchungen in dem Zeitraum geben), deshalb müssen diese mit einer Aggregatfunktion wie SUM() "behadndelt" werden, damit da nur noch ein Wert pro Filialie entsteht.
Es gibt eine relativ einfache Regel, wenn gruppiert wird, müssen alle Spalten nach dem SELECT, die nicht im GROUP BY stehen, mit einer Aggregatfunktion (SUM, COUNT, AVG, MIN, etc.) zusammengefasst werden, dort dürfen keine weiteren Spalten ohne Aggregatfunktion stehen.
Also kurz gesagt: Benötige ich ein GROUP BY, muss ich eine Aggregatfunktion nutzen.