Level 7: Gruppieren mit GROUP BY

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.

Tabelle sales (12 Zeilen)
idsellerregionmonthamount
1AnaNorth2025-01300
2AnaNorth2025-02450
3AnaNorth2025-03400
4BenNorth2025-01500
5BenNorth2025-02350
6BenNorth2025-03600
7CleoSouth2025-01200
8CleoSouth2025-02700
9CleoSouth2025-03650
10DanSouth2025-01400
11DanSouth2025-02400
12DanSouth2025-03100

Ergebnis des Beispiels

regiontotal
North2600
South2450

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

  1. Geführt · Zeige die Verkaufssumme (amount) jedes Verkäufers (seller). (Tabelle: sales)
  2. Training · Zeige die Zahl der Mitarbeitenden jeder Abteilung. (Tabelle: staff)
  3. Training · Zeige den Notendurchschnitt jedes Fachs, auf eine Nachkommastelle gerundet. (Tabelle: grades)
  4. Training · Zeige die Verkaufssumme für jedes Paar aus Region und Monat. (Tabelle: sales)
  5. Herausforderung · 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). (Tabelle: books)

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.

Level 7 in SpeedQL öffnen

·