[GROUP BY Attribut [, Attribut] [HAVING Bedingung] ]
Gruppierungen von Datensätzen wird in den allermeisten Fällen zusammen mit Aggregatsfunktionen verwendet (weil es sonst einfach keinen Sinn macht). Schauen wir ein Beispiel an.
Sie haben eine Tabelle "tblAngestellte" mit 9 Datensätzen. Einige wohnen in den USA, einige in UK und zwei Personen in der Schweiz.
Geben Sie mal den folgenden SQL-Befehl ein:
SELECT * FROM tblAngestellte GROUP BY tNachname;
Was kriegen Sie? Vergleichen Sie die Ausgabe mit der Orginal-Tabelle. Was hat sich geändert?
Schräg, nicht? Wir haben nicht mehr 9, sondern 8 Angestellte. Wo zum Geier ist da jemand verlorengegangen?
Wenn Sie gut schauen, sehen Sie, dass wir zwei Meier haben: Meier Susi aus Bern und Meier Michael aus Thun.
Und obiges GROUP BY-Statement macht nichts anderes, als alle Attribute im GROUP BY Statement zu gruppieren, konkret, die doppelten rauszuwerfen.
Warum aber gerade das Susi aus Bern angezeigt wird und nicht der Michael aus Thun, ist unklar.
Ein GROUP BY macht höchstens dann mal Sinn, wenn Sie beispielsweise eine Liste aller Länder möchten, in welchen die Angestellten wohnen. Da möchten Sie natürlich keine doppelten Datensätze kriegen. Dann kann folgender Befehl durchaus Sinn machen:
SELECT Country FROM tblAngestellte GROUP BY Country;
Aber für alle anderen Fälle nehmen wir die Aggregationsfunktionen dazu, welche jetzt gleich erklärt werden.
Unter Aggregierung versteht man das Gleiche wie "Gruppierung", meint aber meist auch gleich, dass man pro Gruppe eine Berechnung vornehmen will. Und solche Funktionen, mit denen man im Zusammenhang mit GROUP BY Berechnungen anstellen kann, werden "Aggregationsfunktionen" genannt.
Beispielsweise wollen wir wissen, wie viele Angestellte pro Land vorhanden sind.
Die SQL-Anweisung könnte wie folgt aussehen:
SELECT Country, COUNT(Country) FROM tblAngestellte GROUP BY Country;
Dies führt zu folgender Ausgabe:
Hier sehen Sie nun sofort in der ersten Zeile, dass eine Person kein Land zugeordnet hat. Der Rest sollte selbsterklärend sein😎.
Sie sehen, dass die Spaltenüberschriften nicht sonderlich schön sind. Passen Sie das SQL-Statement so an, dass die Ausgabe wie folgt aussieht:
Die Liste ist schon mal prima, aber Ihre Chefin möchte diese gerne gleich so sortiert haben, dass die grösste Anzahl oben steht.
Die Chefin ist immer noch nicht zufrieden🙈. Dass es Angestellte ohne Land hat, ist für sie ein technisches Problem, das wir zwar lösen sollen, aber sie interessiert sich nur für diejenigen Angestellten, welche wirklich ein auch ein Land zugeordnet haben.
Passen Sie Ihr SQL-Statement so an, dass die Liste die leere Zeile ausblendet, also so:
Tipp: spicken Sie sonst kurz im Kapitel Die SELECT-Anweisung.
Sämtliche Aggregatsfunktionen kennen Sie bereits, und zwar von Excel! Hier die Funktionen, um die es geht:
Sie können diese ohne Probleme auch kombinieren. Beispielsweise so:
Versuchen Sie, mit Hilfe der Tabelle "tblBestellungen" diese Ausgabe zu erstellen.
Hinweis: hier benötigen Sie keine GROUP BY-Klausel, sondern nur zwei der obigen Funktionen.
Jetzt können wir das Ganze noch nach nach tKundenID gruppieren. Dann sollten Sie eine Liste wie die folgende kriegen:
Hier der SQL-Befehl mit der ergänzten GROUP BY-Klausel:
SELECT COUNT(tKundenID) AS "Anzahl Bestellungen", SUM(round(tFrachtkosten,0)) AS "Gesamtfrachtkosten" FROM tblBestellungen GROUP BY tKundenID;
Das ist zwar gut und recht, aber wir haben ein Problem…
Also ergänzen wir das Attribut "tKundenID" ganz links noch, und danach sieht die Liste so aus:
Selbstverständlich wäre es schön, wenn wir hier gleich den Namen der Kund*innen lesen könnten. Wie gesagt, kommt das dann im Kapitel JOIN in Aktion.