Über ein einzelnes GROUP BY hinaus
Auf mehreren Ebenen aggregieren
Über ein einzelnes GROUP BY hinaus ist eine kostenlose SQL Academy-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des SQL Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Die Einschränkung eines einzelnen GROUP BY
Mit einer standardmäßigen GROUP BY-Klausel können Sie Zeilen auf einer bestimmten Ebene aggregieren — etwa den Gesamtumsatz pro Region. Was aber, wenn Sie in derselben Abfrage zusätzlich Summen pro Produktkategorie und eine Gesamtsumme wünschen?
Die Abfrage dreimal zu wiederholen und UNION ALL zu verwenden funktioniert, ist aber umständlich und langsam. SQL bietet drei leistungsstarke Erweiterungen — GROUPING SETS, ROLLUP und CUBE —, die dieses Problem elegant in einem einzigen Durchlauf lösen.
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;Einrichtung der Beispieltabelle
In dieser Lektion verwenden Sie eine einfache Tabelle sales, in der jeder Verkauf mit einer region, einer category und einem amount erfasst wird. Erstellen und befüllen Sie die Tabelle, damit jede der folgenden Abfragen im richtigen Kontext verständlich ist.
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales (region, category, amount) VALUES
('North', 'Electronics', 1200),
('North', 'Clothing', 800),
('South', 'Electronics', 950),
('South', 'Clothing', 600),
('East', 'Electronics', 1100),
('East', 'Clothing', 750);Was sind GROUPING SETS?
GROUPING SETS ermöglicht es Ihnen, mehrere unabhängige Gruppierungsebenen innerhalb einer einzigen GROUP BY-Klausel zu definieren. Jeder Satz in der Liste erzeugt eine eigene Gruppe von Zeilen – genau so, als hätten Sie separate Abfragen geschrieben und sie mit UNION ALL zusammengeführt.
Die Syntax lautet: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). Die leere Menge () steht für die Gesamtsumme über alle Zeilen.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);Die Ausgabe von GROUPING SETS lesen
Wenn Sie eine GROUPING SETS-Abfrage ausführen, werden die Zeilen aus den verschiedenen Gruppierungsebenen untereinander angeordnet. Spalten, die nicht Teil eines bestimmten Satzes sind, erscheinen in dieser Zeile als NULL.
Eine Zeile aus dem Satz (region) enthält beispielsweise in der Spalte category den Wert NULL. Das zeigt an, dass diese Summe alle Kategorien für diese region umfasst. Die Zeile mit der Gesamtsumme (leere Menge) enthält sowohl in region als auch in category den Wert NULL.
SELECT
COALESCE(region, 'ALL REGIONS') AS region,
COALESCE(category, 'ALL CATEGORIES') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY region NULLS LAST, category NULLS LAST;Einführung in ROLLUP
ROLLUP ist eine Kurzform für eine häufig verwendete Hierarchie von Gruppierungssätzen. Für die Spalten (A, B) erzeugt ROLLUP(A, B) automatisch die Sätze (A, B), (A) und ().
Das eignet sich ideal für hierarchische Daten, etwa von Jahr zu Monat zu Tag oder von Region zu Kategorie. Die Anzahl der erzeugten Sätze beträgt immer n + 1, wobei n die Anzahl der aufgeführten Spalten ist.
-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;ROLLUP mit drei Ebenen
Wenn Sie ROLLUP um eine dritte Spalte erweitern, wird die Hierarchie um eine weitere Ebene ergänzt. ROLLUP(A, B, C) erzeugt vier Sätze: (A, B, C), (A, B), (A) und ().
Im folgenden Beispiel ist year die äußerste Ebene und category die detaillierteste. Die Abfrage erzeugt auf jeder Stufe der Hierarchie eine Zwischensumme sowie eine zusätzliche Zeile mit der Gesamtsumme.
SELECT
year,
region,
category,
SUM(amount) AS total
FROM (
VALUES
(2024, 'North', 'Electronics', 1200),
(2024, 'North', 'Clothing', 800),
(2024, 'South', 'Electronics', 950),
(2025, 'North', 'Electronics', 1400),
(2025, 'South', 'Clothing', 700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;Einführung in CUBE
CUBE ist noch umfassender als ROLLUP. Für n Spalten erzeugt es alle 2^n möglichen Kombinationen von Gruppierungssätzen, einschließlich der Gesamtsumme.
Für CUBE(region, category) werden die folgenden Sätze erzeugt: (region, category), (region), (category) und () – insgesamt vier Sätze. Das ist nützlich, wenn Sie Querschnittssummen in jede Richtung benötigen und nicht nur entlang einer einzigen Hierarchie.
-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;CUBE vs. ROLLUP – wann verwendet man was?
Wählen Sie abhängig davon, ob Ihre Dimensionen eine natürliche Hierarchie besitzen:
- Verwenden Sie ROLLUP, wenn die Spalten hierarchisch angeordnet sind, etwa von Land über Stadt bis zur Filiale. Die Zwischensummen werden nur entlang eines Pfads gebildet.
- Verwenden Sie CUBE, wenn die Spalten unabhängige Dimensionen sind, etwa Region und Kategorie, und Sie jeden möglichen Querschnitt benötigen.
- Verwenden Sie GROUPING SETS, wenn Sie die vollständige Kontrolle benötigen und weder ROLLUP noch CUBE genau Ihren Anforderungen entspricht.
Die Funktion GROUPING()
Da NULL sowohl für einen tatsächlich fehlenden Wert als auch für einen Gruppierungsplatzhalter stehen kann, stellt SQL die Funktion GROUPING() bereit. Sie gibt 1 zurück, wenn die Spalte zu einer Überaggregatzeile (Platzhalterzeile) gehört, und 0, wenn die Spalte tatsächlich zur Gruppierung verwendet wurde.
Damit können Sie einen echten NULL-Wert in region von einer Zwischensummenzeile unterscheiden, die sich auf alle Regionen erstreckt.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_subtotal,
GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Zeilen mit GROUPING() beschriften
Ein häufig verwendetes Muster kombiniert GROUPING() mit einem CASE-Ausdruck, um anstelle von unverarbeiteten NULL-Werten verständliche Bezeichnungen zu erzeugen. Dadurch lässt sich die Ausgabe einer ROLLUP- oder CUBE-Abfrage in Berichten deutlich leichter lesen.
SELECT
CASE GROUPING(region)
WHEN 1 THEN 'Grand Total'
ELSE region
END AS region_label,
CASE GROUPING(category)
WHEN 1 THEN 'All Categories'
ELSE category
END AS category_label,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;Feste Spalten mit ROLLUP kombinieren
Sie können reguläre GROUP BY-Spalten und ROLLUP oder CUBE in derselben Klausel kombinieren. Spalten, die außerhalb von ROLLUP(...) aufgeführt sind, werden in jeden Gruppierungssatz aufgenommen – sie werden niemals aufgerollt.
In der folgenden Abfrage ist year eine feste Gruppierungsspalte, während region und category am Rollup teilnehmen. Daher erhalten Sie Zwischensummen pro Jahr und nicht über alle Jahre hinweg.
SELECT
2024 AS year,
region,
category,
SUM(amount) AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;Kurzer Wissenstest
Testen Sie Ihr Verständnis von GROUPING SETS, ROLLUP und CUBE.
Zusammenfassung – mehr als ein einzelnes GROUP BY
In dieser Lektion haben Sie drei leistungsstarke SQL-Erweiterungen kennengelernt, mit denen Sie mehrere Aggregationsebenen in einer einzigen Abfrage erzeugen können:
- GROUPING SETS – vollständige manuelle Kontrolle: Sie listen genau die benötigten Kombinationen auf.
- ROLLUP – ideal für Hierarchien: Die Aggregation wird von der detailliertesten Ebene bis zur Gesamtsumme aufgerollt.
- CUBE – erzeugt jeden möglichen Querschnitt der aufgeführten Dimensionen.
Außerdem haben Sie gelernt, dass GROUPING() echte NULL-Werte von Platzhalterzeilen für Überaggregate unterscheidet und dass CASE GROUPING(...)-Muster eine übersichtliche, gut lesbare Berichtsausgabe erzeugen.
Diese Werkzeuge sind unverzichtbar, wenn Sie mehrdimensionale Zusammenfassungen benötigen – Berichte im Pivot-Stil, Dashboards und Data-Warehouse-Abfragen nutzen sie in großem Umfang.
Häufig gestellte Fragen
Ist die Lektion „Über ein einzelnes GROUP BY hinaus“ kostenlos?
Ja — der vollständige Text von „Über ein einzelnes GROUP BY hinaus“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des SQL Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der SQL Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „Über ein einzelnes GROUP BY hinaus“?
Auf mehreren Ebenen aggregieren Du übst SQL Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um SQL Academy zu starten?
Keine Vorkenntnisse erforderlich. SQL Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.
Wie lange dauert die Lektion „Über ein einzelnes GROUP BY hinaus“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser SQL Academy-Lektion Code schreiben und ausführen?
Ja. Jede SQL Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Über ein einzelnes GROUP BY hinaus
- ROLLUP für Zwischensummen
- CUBE für alle Kombinationen
- GROUPING SETS erklärt