GROUP BY ·
Aggregatfunktionen ·
HAVING ·
Mehrfachgruppierung ·
ROLLUP / CUBE ·
Praxisbeispiele
Mit GROUP BY gruppieren Sie Datensätze und berechnen Aggregatwerte pro Gruppe. HAVING filtert die Gruppen nach Aggregatbedingungen – eine leistungsstarke Kombination für Auswertungen und Berichte.
GROUP BY gruppiert Datensätze mit gleichen Werten in den angegebenen Spalten. Zusammen mit Aggregatfunktionen wie COUNT, SUM, AVG werden gruppierte Auswertungen ermöglicht.
| Regel | Beschreibung |
|---|---|
| SELECT-Spalten | Nur GROUP BY-Spalten oder Aggregatfunktionen erlaubt |
| Reihenfolge | WHERE → GROUP BY → HAVING → ORDER BY |
| NULL-Werte | NULL wird als eigene Gruppe behandelt |
| Mehrere Spalten | Gruppierung nach Kombination der Spalten |
| Alias | Im GROUP BY kann der Spalten-Alias verwendet werden |
GROUP BY ohne Aggregatfunktion ist äquivalent zu SELECT DISTINCT. Der Unterschied: GROUP BY ist die Grundlage für weitere Aggregationen.
Aggregatfunktionen berechnen Werte über eine Gruppe von Zeilen. Sie werden häufig mit GROUP BY kombiniert, können aber auch ohne GROUP BY auf die gesamte Tabelle angewendet werden.
| Funktion | Beschreibung | Beispiel |
|---|---|---|
| COUNT(*) | Zählt alle Zeilen (auch NULL) | COUNT(*) FROM produkte |
| COUNT(spalte) | Zählt Zeilen mit nicht-NULL-Wert | COUNT(rabatt) FROM produkte |
| COUNT(DISTINCT spalte) | Zählt eindeutige Werte | COUNT(DISTINCT kategorie) |
| SUM(spalte) | Summiert alle Werte | SUM(preis) FROM produkte |
| AVG(spalte) | Durchschnittswert | AVG(preis) FROM produkte |
| MIN(spalte) | Kleinster Wert | MIN(preis) FROM produkte |
| MAX(spalte) | Größter Wert | MAX(preis) FROM produkte |
COUNT(*) zählt alle Zeilen, COUNT(spalte) ignoriert NULL-Werte. COUNT(DISTINCT spalte) ist nützlich für die Anzahl eindeutiger Werte.
HAVING filtert Gruppen nach Aggregatbedingungen. WHERE filtert einzelne Zeilen (vor GROUP BY), HAVING filtert Gruppen (nach GROUP BY).
| Merkmal | WHERE | HAVING |
|---|---|---|
| Zeitpunkt | Vor GROUP BY | Nach GROUP BY |
| Aggregatfunktionen | ❌ Nicht erlaubt | ✅ Erlaubt |
| Spalten | Alle Tabellenspalten | GROUP BY-Spalten oder Aggregate |
| Alias | ❌ Nicht erlaubt | ✅ Erlaubt (meistens) |
HAVING ohne GROUP BY ist möglich, aber dann wird die gesamte Tabelle als eine Gruppe behandelt – das ist selten nützlich.
Mehrfachgruppierung gruppiert nach der Kombination mehrerer Spalten. Jede eindeutige Kombination bildet eine eigene Gruppe.
ROLLUP erzeugt Zwischensummen für jede Hierarchie-Ebene. CUBE erzeugt alle möglichen Kombinationen (Kreuztabellen). Diese Funktionen sind in PostgreSQL, SQL Server, Oracle und MySQL (8.0+) verfügbar.
| Funktion | Ergebnis | Anzahl Gruppen |
|---|---|---|
| ROLLUP(a, b, c) | (a,b,c), (a,b), (a), () – Hierarchisch | n + 1 |
| CUBE(a, b, c) | Alle Kombinationen: (a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), () | 2n |
| GROUPING() | Zeigt an, ob ein Wert aggregiert ist (1 = aggregiert) | Für SELECT |
ROLLUP und CUBE sind leistungsstark für Berichte und Dashboards. GROUPING() hilft, aggregierte Zeilen in der Anwendung zu erkennen und zu formatieren.
Praxis-Beispiele zeigen typische Anwendungen von GROUP BY und HAVING für Berichte, Analysen und statistische Auswertungen.
GROUP BY
COUNT
HAVING
Mehrere
ROLLUP
Berichte
SELECT kategorie, COUNT(*) FROM produkte GROUP BY kategorie HAVING COUNT(*) > 5;