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