MINT lernen

Aggregieren und Gruppieren

Zehn Läuferinnen und Läufer, drei Klassen — und am Ende soll pro Klasse nur eine Zahl stehen.

1

Viele Zeilen, ein Wert

  • Aggregatfunktion:fasst die Werte einer Spalte zu einem Wert zusammen.
  • COUNT:COUNT(*) zählt Zeilen; COUNT(Attribut) zählt nur Zeilen, in denen das Attribut nicht NULL ist.
  • SUM, AVG:Summe und Mittelwert einer Zahlenspalte.
  • MIN, MAX:kleinster und größter Wert — auch bei Texten (alphabetisch) und Datumswerten.
  • Mit WHERE:erst filtert WHERE die Zeilen, dann wird über den Rest gerechnet.
SELECT COUNT(*) AS Anzahl, AVG(Runden) AS Schnitt
FROM Lauf
WHERE Klasse = '10a';
2

Gruppen bilden

  • GROUP BY:bildet für jeden Wert des Gruppierungsattributs eine Gruppe — jede Gruppe wird zu einer Ergebniszeile.
  • SELECT-Regel:im SELECT stehen nur Gruppierungsattribute und Aggregatfunktionen.
  • HAVING:filtert ganze Gruppen nach einem Aggregatwert, z. B. HAVING COUNT(*) > 3.
  • WHERE oder HAVING:WHERE wirkt auf Zeilen vor dem Gruppieren, HAVING auf Gruppen danach.

Wähle eine Funktion und schalte GROUP BY ein. „Überlagern“ legt die Zeilen jeder Gruppe übereinander und rechnet sie zu einer Ergebniszeile zusammen — vergleiche links die Tabelle mit rechts dem Ergebnis.

Zeilen übereinanderlegen

Funktion
Gruppen

Halte fest: Ohne GROUP BY wird die ganze Tabelle zu einer Zeile. Mit GROUP BY Klasse entsteht eine Zeile pro Klasse; HAVING streicht danach ganze Gruppen.

Herleitung:

SELECT *
FROM Ausleihe;
gruppieren
Frage: Welche Genres wurden mehr als zweimal ausgeliehen — und wie viele Tage im Schnitt? Start: alle Ausleihen.
SELECT Genre, COUNT(*), AVG(Tage)
FROM Ausleihe
GROUP BY Genre;
Gruppen filtern
Eine Zeile je Genre; Anzahl und Mittelwert werden pro Gruppe berechnet.
SELECT Genre, COUNT(*) AS Anzahl, AVG(Tage) AS Schnitt
FROM Ausleihe
GROUP BY Genre
HAVING COUNT(*) > 2
ORDER BY Anzahl DESC;
Ergebnis
Die Bedingung betrifft eine Anzahl pro Gruppe — also HAVING, nicht WHERE. Zum Schluss sortiert.
Merke

Gruppierte Abfrage:

SELECT Gruppenattribut, AGG(Attribut)
FROM Tabelle
WHERE Zeilenbedingung
GROUP BY Gruppenattribut
HAVING Gruppenbedingung;
3

Allgemeine Hinweise

WHERE kennt keine Summen

WHERE COUNT(*) > 2 ist ein Fehler: Beim Filtern der Zeilen gibt es noch keine Gruppen. Bedingungen an Aggregate gehören in HAVING.

Fremde Spalten im SELECT

SELECT Name, AVG(Runden) … GROUP BY Klasse ist unzulässig: Welcher Name soll für die ganze Klasse stehen?

COUNT(*) oder COUNT(Spalte)?

Sobald NULL-Werte möglich sind, liefern beide verschiedene Zahlen. Lies genau, ob Zeilen oder vorhandene Werte gezählt werden sollen.

Videos