SQL_LEVEL_4_SOLUTION - OnlyCook/abitur-elite-code GitHub Wiki
Level S4 – Musterlösung: Gruppierung (GROUP BY)
Lösung
SELECT genre, AVG(preis) AS Durchschnitt
FROM Buch
GROUP BY genre
Erklärung
Das Problem: Rechnen über mehrere Zeilen
Manchmal willst du nicht einzelne Zeilen ausgeben, sondern Zeilen zusammenfassen und dabei etwas berechnen – zum Beispiel den Durchschnittspreis pro Genre. Dafür brauchst du zwei Dinge zusammen: eine Aggregatfunktion und GROUP BY.
Aggregatfunktionen
Aggregatfunktionen fassen mehrere Werte zu einem einzigen Ergebnis zusammen. Die wichtigsten:
| Funktion | Bedeutung |
|---|---|
AVG(spalte) |
Durchschnittswert |
SUM(spalte) |
Summe aller Werte |
COUNT(spalte) |
Anzahl der Zeilen |
MIN(spalte) |
Kleinstes Wert |
MAX(spalte) |
Größter Wert |
In diesem Level wird AVG(preis) verwendet – das berechnet den Durchschnitt aller preis-Werte, die in eine Gruppe fallen.
GROUP BY – Zeilen gruppieren
GROUP BY fasst alle Zeilen mit demselben Wert in einer Spalte zu einer Gruppe zusammen. Auf diese Gruppe wird dann die Aggregatfunktion angewendet.
Stell dir die Tabelle so vor:
| titel | genre | preis |
|---|---|---|
| Faust | Drama | 10.00 |
| Iphigenie | Drama | 12.00 |
| Es | Horror | 15.00 |
| Shining | Horror | 13.00 |
| Der Marsianer | SciFi | 20.00 |
Mit GROUP BY genre entstehen drei Gruppen – eine pro Genre. AVG(preis) wird dann für jede Gruppe separat berechnet:
| genre | AVG(preis) |
|---|---|
| Drama | 11.00 |
| Horror | 14.00 |
| SciFi | 20.00 |
AS – Spalten umbenennen
Das Ergebnis von AVG(preis) hätte standardmäßig einen hässlichen automatisch generierten Spaltennamen. Mit AS gibst du der Spalte einen eigenen Namen:
AVG(preis) AS Durchschnitt
Das funktioniert für jede Spalte im SELECT, ist aber besonders bei Aggregatfunktionen üblich. Achte darauf, dass der Name exakt so geschrieben wird, wie die Aufgabe es verlangt – Groß- und Kleinschreibung kann dabei eine Rolle spielen.
Die Regel hinter GROUP BY
Sobald du GROUP BY verwendest, gilt eine wichtige Einschränkung: Jede Spalte im SELECT, die keine Aggregatfunktion ist, muss auch in GROUP BY stehen. Das macht Sinn – wenn Zeilen zusammengefasst werden, kann SQL nur dann einen eindeutigen Wert pro Gruppe ausgeben, wenn die Spalte der Gruppierungsschlüssel ist.
SELECT genre, AVG(preis) AS Durchschnitt
FROM Buch
GROUP BY genre
-- ↑ genre steht im SELECT ohne Aggregatfunktion → muss hier stehen