Alle BeiträgeDas PerSight-Team · Zuletzt aktualisiert: 23. Juli 2026 · 7 Min. Lesezeit

SQL GROUP BY: Gruppieren und Aggregieren verstehen

Monatsumsatz, Bestellungen pro Kunde, Stückzahl je Kategorie: Aggregation mit GROUP BY. COUNT/SUM/AVG, der Unterschied zwischen WHERE und HAVING und die ONLY_FULL_GROUP_BY-Falle von MySQL, mit echten Beispielen.

Fragen wie "Wie viel haben wir je Monat verkauft?" oder "Wie viele Bestellungen pro Kunde?" drehen sich nicht um einzelne Zeilen, sondern um Gruppen von Zeilen. In SQL bündelt GROUP BY Zeilen nach einer Spalte und erzeugt eine einzige Zahl je Bündel. Sitzt die Idee einmal, fällt die Hälfte Ihrer Berichte daraus ab.

Was genau macht GROUP BY?

GROUP BY fasst Zeilen mit gleichem Wert zu einer Gruppe zusammen, und die Aggregatfunktion im SELECT (COUNT, SUM, AVG, MIN, MAX) liefert ein Ergebnis je Gruppe. Sehen wir uns die Anzahl je Kategorie an:

SELECT kategorie,
       COUNT(*) AS anzahl_produkte,
       AVG(preis) AS durchschnittspreis
FROM produkte
GROUP BY kategorie
ORDER BY anzahl_produkte DESC;

Die goldene Regel: Jede Spalte im SELECT muss entweder in GROUP BY stehen oder in einer Aggregatfunktion. Sonst weiß die Datenbank nicht, welchen Wert der Gruppe sie ausgeben soll.

Was ist der Unterschied zwischen WHERE und HAVING?

Beide filtern, aber zu unterschiedlichen Zeitpunkten. WHERE entfernt Zeilen vor dem Gruppieren; HAVING entfernt Gruppen nach dem Gruppieren. Eine Bedingung wie "Kunden mit mindestens fünf Bestellungen" ist erst nach dem Gruppieren bekannt und gehört daher in HAVING:

SELECT kunden_id, COUNT(*) AS anzahl_bestellungen
FROM bestellungen
WHERE bestelldatum >= DATE '2026-01-01'
GROUP BY kunden_id
HAVING COUNT(*) >= 5;
SQL Server kennt das DATE-Literal nicht; schreiben Sie das Datum dort als einfachen String (2026-01-01).

Achten Sie auf die Reihenfolge: erst WHERE (Bestellungen vor 2026 verwerfen), dann GROUP BY (nach Kunde bündeln), dann HAVING (wer weniger als fünf hat, fliegt raus). Diese Reihenfolge zu kennen räumt die meisten "Warum ist mein Ergebnis falsch?"-Momente aus.

Nach mehreren Spalten gruppieren

Sie können GROUP BY mehrere Spalten geben; die Gruppen bilden sich dann über deren Kombination. Umsatz nach Jahr und Monat ist der Klassiker:

SELECT EXTRACT(YEAR FROM bestelldatum)  AS jahr,
       EXTRACT(MONTH FROM bestelldatum) AS monat,
       SUM(betrag) AS umsatz
FROM bestellungen
GROUP BY EXTRACT(YEAR FROM bestelldatum), EXTRACT(MONTH FROM bestelldatum)
ORDER BY jahr, monat;
PostgreSQL / Oracle. Auf SQL Server YEAR(bestelldatum), MONTH(bestelldatum); MySQL genauso.

Worauf sollte ich je Datenbank achten?

Die übliche Verwirrungsquelle ist MySQL: Ist ONLY_FULL_GROUP_BY deaktiviert, gibt MySQL bereitwillig eine Spalte aus, die nicht in GROUP BY steht, und liefert dafür einen beliebigen Wert. Still und gefährlich. Modernes MySQL liefert den Modus eingeschaltet aus; lassen Sie ihn an. PostgreSQL, SQL Server und Oracle werfen in dieser Situation einen Fehler und bewahren Sie so vor dem falschen Ergebnis.

Häufig gestellte Fragen

Was ist der Unterschied zwischen GROUP BY und DISTINCT?
DISTINCT entfernt nur doppelte Zeilen; GROUP BY bildet Gruppen und erlaubt Ihnen, je Gruppe zu aggregieren (SUM, COUNT usw.). Wollen Sie nur eine Liste eindeutiger Werte, genügt DISTINCT; brauchen Sie eine Zahl je Gruppe, brauchen Sie GROUP BY.
Sind COUNT(*) und COUNT(spalte) dasselbe?
Nein. COUNT(*) zählt jede Zeile der Gruppe; COUNT(spalte) zählt nur die Nicht-NULL-Werte dieser Spalte. Bei einer Spalte mit NULL-Werten liefern die beiden unterschiedliche Ergebnisse.
Was passiert beim Aggregieren mit NULL-Werten?
Funktionen wie SUM, AVG und COUNT(spalte) ignorieren NULL. Besonders bei AVG ist das wichtig: NULL wird nicht als Null gezählt, sondern ganz weggelassen. Sollen sie als Null zählen, wandeln Sie NULL mit COALESCE in 0 um.
Kann ich Gruppen nach ihrem Aggregatergebnis sortieren?
Ja. Verwenden Sie die Aggregatfunktion oder ihren Alias in ORDER BY; zum Beispiel bringt ORDER BY SUM(betrag) DESC die umsatzstärkste Gruppe nach oben.

Denselben Bericht ohne SQL? Sagen Sie PerSight "zeige den Umsatz 2026 nach Monat" oder "hol mir Kunden mit mindestens fünf Bestellungen." Es legt die Antwort als Tabelle und Diagramm vor und zeigt die GROUP-BY-Abfrage dahinter.

Quellen