Skript: Datenbanken und SQL mit der Warenautomat-Datenbank
12. GROUP BY und Aggregatsfunktionen
Sind die Daten verknüpft, kann man sie im nächsten Schritt verdichten und zusammenfassen. Dafür sind Aggregatsfunktionen und GROUP BY zuständig.
12.1 COUNT, SUM, AVG, MIN, MAX
Aggregatsfunktionen verdichten viele Zeilen zu einem Ergebnis. Sie werden genutzt, um Daten zusammenzufassen und Kennzahlen zu berechnen.
Wichtige Funktionen:
COUNT(*): Anzahl der Zeilen.SUM(spalte): Summe über eine Zahlenspalte.AVG(spalte): Durchschnitt.MIN(spalte): Kleinster Wert.MAX(spalte): Größter Wert.
[!NOTE] Beispiele:
SELECT COUNT(*) AS anzahl_produkte FROM produkt; SELECT SUM(aktueller_bestand) AS gesamtbestand FROM inventar; SELECT AVG(preis_eur) AS durchschnittspreis FROM produkt;
12.2 GROUP BY
GROUP BY bildet Gruppen, auf die Aggregatsfunktionen angewendet werden. Statt eines Gesamtergebnisses erhält man pro Gruppe ein Teilergebnis.
Grundmuster:
SELECT gruppenspalte, AGGREGAT(spalte)
FROM tabelle
GROUP BY gruppenspalte;
[!NOTE] Beispiel:
SELECT kategorie, COUNT(*) AS anzahl FROM produkt GROUP BY kategorie;
Wichtige Regel:
- Alle Spalten in
SELECT, die nicht aggregiert sind, müssen inGROUP BYstehen. - Sonst entstehen je nach SQL-Modus Fehler oder unklare Ergebnisse.
12.3 GROUP BY mit mehreren Spalten
Gruppierung kann über mehrere Spalten erfolgen.
[!NOTE] Beispiel:
SELECT automat_id, produkt_id, SUM(aktueller_bestand) AS bestand_summe FROM inventar GROUP BY automat_id, produkt_id;
Hier entsteht je Kombination aus automat_id und produkt_id genau eine Gruppe.
12.4 GROUP_CONCAT
Mit GROUP_CONCAT können Werte je Gruppe als Text zusammengefasst werden.
[!NOTE] Beispiel:
SELECT l.name AS lieferant, GROUP_CONCAT(p.name ORDER BY p.name SEPARATOR ', ') AS produkte FROM lieferant l JOIN produkt p ON p.lieferant_id = l.lieferant_id GROUP BY l.name;
12.5 Typische Fehler bei Aggregation und GROUP BY
- Nicht gruppierte Spalte in
SELECT: Spalte ist weder aggregiert noch inGROUP BYenthalten. - Verwechslung von
WHEREundHAVING:WHEREfiltert vor der Gruppierung,HAVINGnach der Gruppierung. - Falsche inhaltliche Gruppierung: Zu grob oder zu fein gruppiert, dadurch falsche Kennzahlen.
- Fehlende Sortierung:
Ergebnisse ohne
ORDER BYsind oft schwer vergleichbar.
[!NOTE] Beispiel für saubere Kombination:
SELECT kategorie, COUNT(*) AS anzahl, ROUND(AVG(preis_eur), 2) AS avg_preis FROM produkt WHERE aktiv = TRUE GROUP BY kategorie ORDER BY anzahl DESC;
Querverweise
Übungen zum Kapitel
Übung 1: Zähle alle Produkte.
Lösung
**Lösung:** ```sql SELECT COUNT(*) AS anzahl_produkte FROM produkt; ```Übung 2: Gib die Anzahl Produkte pro Kategorie aus.
Lösung
**Lösung:** ```sql SELECT kategorie, COUNT(*) AS anzahl FROM produkt GROUP BY kategorie; ```Übung 3: Gib alle Produktnamen je Lieferant zusammengefasst aus.
Lösung
**Lösung:** ```sql SELECT l.name AS lieferant, GROUP_CONCAT(p.name ORDER BY p.name SEPARATOR ', ') AS produkte FROM lieferant l JOIN produkt p ON p.lieferant_id = l.lieferant_id GROUP BY l.name; ```Übung 4: Gib je Kategorie den kleinsten und größten Preis aus.
Lösung
**Lösung:** ```sql SELECT kategorie, MIN(preis_eur) AS min_preis, MAX(preis_eur) AS max_preis FROM produkt GROUP BY kategorie; ```Übung 5: Erkläre den Unterschied zwischen COUNT(*) und COUNT(spalte).
Lösung
**Lösung:** `COUNT(*)` zählt alle Zeilen. `COUNT(spalte)` zählt nur Zeilen, in denen `spalte` nicht `NULL` ist.Übung 6: Warum ist folgende Abfrage problematisch?
SELECT kategorie, name, COUNT(*) FROM produkt GROUP BY kategorie;