Gruppen nach mehreren Spalten
GROUP BY kann mehrere Spalten haben, durch Kommas getrennt. Zeilen kommen dann nur in dieselbe Gruppe, wenn sie in allen denselben Wert haben. Wie viele Spiele jedes Genres gibt es für jedes Alter?
SELECT genre, altersfreigabe, COUNT(*) AS anzahl_spiele
FROM spiele
GROUP BY genre, altersfreigabe
ORDER BY genre, altersfreigabe;| genre | altersfreigabe | anzahl_spiele |
|---|---|---|
| Action | 12 | 1 |
| Action | 16 | 2 |
| Action | 18 | 1 |
| Adventure | 7 | 1 |
| Adventure | 12 | 2 |
| … | … | … |
Die vier Action-Spiele haben sich aufgeteilt: Zwei sind ab 16 (Shadow Ninja und Robot Rebellion), eines ab 12 und eines ab 18. Das Ergebnis hat eine Zeile für jede Kombination aus einem Genre und einem Alter, die in der Tabelle vorkommt. Kombinationen ohne Spiel, wie Action-Spiele für 3-Jährige, fehlen.
Die Regel aus den vorherigen Übungen gilt weiter: Jede Spalte in SELECT, die nicht in einer Aggregatfunktion steht, muss in GROUP BY stehen. Hier sind das genre und altersfreigabe.
Du kannst auch nach einem Ausdruck gruppieren, zum Beispiel nach einer Funktion. Mit strftime('%Y', …) aus der Lektion über Funktionen bekommst du die Anzahl der Kunden, die in jedem Jahr beigetreten sind:
SELECT strftime('%Y', beigetreten) AS jahr, COUNT(*) AS neue_kunden
FROM kunden
GROUP BY strftime('%Y', beigetreten)
ORDER BY jahr;| jahr | neue_kunden |
|---|---|
| 2023 | 5 |
| 2024 | 5 |
| 2025 | 4 |
Schreibe in GROUP BY denselben Ausdruck wie in SELECT. Und du kannst ihn auch mit Spalten kombinieren: GROUP BY strftime('%Y', beigetreten), stadt würde die neuen Kunden jeder Stadt in jedem Jahr zählen.
Typischer Fehler: eine Spalte in GROUP BY weglassen. SELECT genre, altersfreigabe, COUNT(*) FROM spiele GROUP BY genre; hat eine Zeile für jedes Genre, und seine altersfreigabe ist die eines Spiels des Genres, wie du es vor zwei Übungen bei den Titeln gesehen hast.
So schreibst du es:
Anweisungen
- 1
Wie viele Bewertungen hat jedes Spiel mit jeder Sternezahl bekommen? Zeige
spiel_id,sterneund die Anzahl der Bewertungen in einer Spalteanzahl_bewertungen, sortiert nachspiel_idund dann nachsterne:spiel_id sterne anzahl_bewertungen 1 3 1 1 4 1 1 5 2 2 2 1 … … … - 2
Zähle darunter die Bestellungen jedes Jahres mit jedem Status: das Jahr (
strftime('%Y', bestellt_am)) in einer Spaltejahr, dannstatusund die Anzahl der Bestellungen in einer Spalteanzahl_bestellungen, sortiert nach Jahr und Status:jahr status anzahl_bestellungen 2024 bezahlt 14 2024 erstattet 1 2025 bezahlt 14 2025 erstattet 1