Level 7: Gruppieren mit GROUP BY
Aktualisiert am
Mittelstufe · Level 7 von 20. Ziel: Ein Aggregat für jede Gruppe von Zeilen berechnen: Summe pro Verkäufer, Durchschnitt pro Fach…
Themen: GROUP BY Aggregate pro Gruppe Gruppierung nach mehreren Spalten
Lektion
Die Aggregate aus Level 5 fassen die ganze Tabelle zusammen. Oft will man stattdessen eine Zusammenfassung pro Kategorie: den Umsatz jedes Verkäufers, den Durchschnitt jedes Fachs, die Zahl der Filme jedes Genres. Das ist die Aufgabe von GROUP BY.
GROUP BY region arbeitet in drei Schritten. Zuerst sortiert SQL die Zeilen in Pakete: alle Verkäufe mit der Region 'North' in ein Paket, alle aus 'South' in ein anderes. Dann berechnet es die Aggregate in jedem Paket getrennt. Schließlich liefert es eine einzige Zeile pro Paket. Aus den 12 Verkäufen werden so 2 Zeilen: North mit einer Summe von 2600, South mit 2450.
Daraus folgt die goldene Regel: Im SELECT muss jede Spalte entweder im GROUP BY stehen oder in einem Aggregat. Eine Ergebniszeile steht für ein ganzes Paket. Die Region ist für das ganze Paket gleich: Man kann sie anzeigen. Der Betrag ändert sich von Verkauf zu Verkauf: Man kann nur seine Summe, seinen Durchschnitt oder sein Maximum anzeigen. Eine Spalte, die gegen die Regel verstößt, hat keinen eindeutigen Wert zum Anzeigen.
Man kann nach mehreren Spalten gruppieren: GROUP BY region, month bildet ein Paket pro Paar (Region, Monat). Zeilen, deren Gruppierungsspalte NULL ist, bilden ein eigenes Paket.
GROUP BY sortiert das Ergebnis nicht: Füge ORDER BY hinzu, wenn die Reihenfolge wichtig ist.
Die Ausführungsreihenfolge wächst: FROM, WHERE (filtert die Zeilen), GROUP BY (bildet die Pakete), SELECT (berechnet eine Zeile pro Paket), ORDER BY. Das WHERE wirkt also vor der Gruppierung: Mit WHERE month = '2025-01' werden nur die Januar-Verkäufe auf die Pakete verteilt.
Syntax
SELECT gruppen_spalte, COUNT(*), SUM(x)
FROM meine_tabelle
WHERE …
GROUP BY gruppen_spalte
ORDER BY …;Kommentiertes Beispiel
SELECT region, SUM(amount) AS total
FROM sales
GROUP BY region;Die 12 Verkäufe werden in zwei Gruppen aufgeteilt (North und South); SUM wird in jeder berechnet.
| id | seller | region | month | amount |
|---|---|---|---|---|
| 1 | Ana | North | 2025-01 | 300 |
| 2 | Ana | North | 2025-02 | 450 |
| 3 | Ana | North | 2025-03 | 400 |
| 4 | Ben | North | 2025-01 | 500 |
| 5 | Ben | North | 2025-02 | 350 |
| 6 | Ben | North | 2025-03 | 600 |
| 7 | Cleo | South | 2025-01 | 200 |
| 8 | Cleo | South | 2025-02 | 700 |
| 9 | Cleo | South | 2025-03 | 650 |
| 10 | Dan | South | 2025-01 | 400 |
| 11 | Dan | South | 2025-02 | 400 |
| 12 | Dan | South | 2025-03 | 100 |
Ergebnis des Beispiels
| region | total |
|---|---|
| North | 2600 |
| South | 2450 |
Das Wichtigste
- Eine Ergebniszeile pro Gruppe.
- Spalten im SELECT: im GROUP BY oder in einem Aggregat.
- WHERE filtert die Zeilen vor der Gruppierung.
Häufige Fallen
- SELECT seller, region, SUM(amount) … GROUP BY seller: region ist weder gruppiert noch aggregiert. Die meisten Datenbanken lehnen die Abfrage ab.
- GROUP BY vergessen ergibt eine einzige Zeile für die ganze Tabelle.
SQLite-Besonderheit
SQLite akzeptiert eine Spalte, die weder gruppiert noch aggregiert ist: Es zeigt ohne Warnung den Wert einer beliebigen Zeile der Gruppe. Das Ergebnis sieht richtig aus, kann aber falsch sein: Halte dich immer an die goldene Regel.
Weiterführend
GROUP_CONCAT(title, ', ') hängt alle Werte einer Gruppe zu einem einzigen Text zusammen, zum Beispiel die Liste der Titel jedes Genres (STRING_AGG in PostgreSQL und SQL Server; SQLite akzeptiert seit Version 3.44 auch string_agg).
Die 5 Übungen des Levels
- Zeige die Verkaufssumme (amount) jedes Verkäufers (seller).
- Zeige die Zahl der Mitarbeitenden jeder Abteilung.
- Zeige den Notendurchschnitt jedes Fachs, auf eine Nachkommastelle gerundet.
- Zeige die Verkaufssumme für jedes Paar aus Region und Monat.
- Zeige für die ab 2015 erschienenen Bücher die Zahl der Bücher pro Genre, vom häufigsten zum seltensten Genre (bei Gleichstand alphabetisch nach Genre).
In SpeedQL wird jede Abfrage sofort geprüft: Ihr Ergebnis wird mit dem erwarteten verglichen, dann läuft die Abfrage noch einmal auf einer versteckten Kontrolldatenbank. Zu jeder Übung gibt es schriftliche Hinweise, die du nur bei Bedarf aufrufst.
Die Übungen von Level 7 machen
Kostenlos und ohne Anmeldung: Die Lektion und die 5 Übungen öffnen sich direkt in deinem Browser.
← Vorheriges Level: Mit Text und Datum arbeiten · Nächstes Level: Gruppen mit HAVING filtern →