Gruppieren mit GROUP BY
Eine Aggregatfunktion allein liefert eine Zahl für die ganze Tabelle. Meistens will man aber eine Zahl je Gruppe: je Bühne, je Band, je Tag.
Die Idee
GROUP BY spalte teilt die Zeilen in Gruppen auf: Alle Zeilen mit demselben Wert in dieser Spalte bilden eine Gruppe. Danach wird jede Aggregatfunktion je Gruppe ausgerechnet.
Das Ergebnis hat so viele Zeilen, wie es Gruppen gibt.
So kann man sich das vorstellen:
graph TD
T["auftritt: 46 Zeilen"] --> G1["buehne_id = 1<br>14 Zeilen"]
T --> G2["buehne_id = 2<br>13 Zeilen"]
T --> G3["buehne_id = 3<br>12 Zeilen"]
T --> G4["buehne_id = 4<br>7 Zeilen"]
G1 --> E["Ergebnis: 4 Zeilen<br>je Gruppe eine"]
G2 --> E
G3 --> E
G4 --> E
Die goldene Regel
Jede Spalte in der SELECT-Liste muss entweder
- im
GROUP BYstehen oder - in einer Aggregatfunktion stecken.
Der Grund ist derselbe wie in der letzten Lektion: Eine Gruppe steht für viele Zeilen. Ein einzelner Spaltenwert daneben wäre nicht eindeutig – es sei denn, nach dieser Spalte wurde gerade gruppiert, dann ist er in der ganzen Gruppe gleich.
Führe beide Abfragen aus.
a) Was liefert die zweite in der Spalte datum? Woher stammt dieser Wert?
b) Warum ist das Ergebnis trotzdem gefährlich, obwohl keine Fehlermeldung erscheint?
c) Ergänze die zweite Abfrage so, dass sie sinnvoll wird – und zwar auf zwei verschiedene Arten.
Gruppieren nach mehreren Spalten
Bei mehreren Spalten bildet jede Kombination von Werten eine eigene Gruppe. Aus 4 Tagen und 4 Bühnen werden hier 16 Gruppen.
Gruppieren mit Verbund
Das ist der Regelfall: Erst verbinden, dann gruppieren.
Aufgaben
a) Wie viele Tickets wurden je Kategorie verkauft, und wie hoch ist der Umsatz je Kategorie? Absteigend nach Umsatz.
b) Wie viele Auftritte gab es an jedem Festivaltag?
c) Wie viele Menschen spielen je Instrument? Absteigend sortiert.
d) Wie hoch ist die durchschnittliche Bewertung je Band? Zeige Bandname und Durchschnitt auf zwei Nachkommastellen, beste zuerst.
Tipp 1: zu d)
Die Punkte stehen in bewertung, der Bandname in band. Dazwischen liegt auftritt – eine Bewertung gehört zu einem Auftritt, nicht direkt zu einer Band. Also drei Tabellen.
Tipp 2: Wonach gruppiere ich?
Die Frage „je …?" verrät es immer: „je Kategorie" → GROUP BY kategorie, „je Band" → GROUP BY b.name.