ROLLUP voor subtotalen
Bereken lopende subtotalen en eindtotalen.
ROLLUP voor subtotalen is een gratis SQL Academy-les op CoddyKit. Dit is les 2 van 4. Je kunt de volledige les hieronder gratis lezen en daarna in de browser praktisch oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is. Deze les maakt deel uit van het leertraject SQL Academy. Je voortgang wordt gesynchroniseerd op het web en in de CoddyKit-app. De cursus SQL Academy bevat in totaal 4 lessen.
Wat is ROLLUP?
Wanneer je gegevens groepeert met GROUP BY, krijg je één rij per groep. Vaak wil je echter ook subtotalen voor elke groep en een eindtotaal voor alle rijen. Dat is precies wat ROLLUP doet.
ROLLUP is een uitbreiding van GROUP BY die automatisch extra samenvattingsrijen aan je resultaatset toevoegt. Zo krijg je subtotalen op elk niveau van de groeperingshiërarchie en aan het einde een definitief eindtotaal.
Voorbeeldgegevens instellen
We maken een eenvoudige sales-tabel om mee te oefenen. De tabel bevat de regio, productcategorie en het verkoopbedrag voor elke transactie. Voer de onderstaande instructies uit om de tabel aan te maken en te vullen.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Electronics', 300),
('East', 'Clothing', 150),
('West', 'Electronics', 700),
('West', 'Clothing', 200),
('West', 'Clothing', 100);Eerst een gewone GROUP BY
Voordat we ROLLUP gebruiken, bekijken we wat een gewone GROUP BY oplevert. De onderstaande query geeft één totaal per paar (region, category) — geen subtotalen en geen eindtotaal.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY region, category
ORDER BY region, category;Kennismaken met GROUP BY ROLLUP
Vervang GROUP BY door GROUP BY ROLLUP(...) en SQL voegt automatisch subtotalenrijen toe. De kolommen binnen ROLLUP() vormen een hiërarchie. Voor elk niveau van die hiërarchie wordt een subtotaal geproduceerd, gevolgd door een eindtotaal.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;De uitvoer van ROLLUP lezen
Het resultaat van ROLLUP bevat drie soorten rijen:
- Detailrijen — één rij per combinatie van (region, category), net als bij een gewone GROUP BY.
- Subtotalenrijen — één rij per regio met
category = NULL, waarin het regionale totaal wordt weergegeven. - Rij met het eindtotaal — één rij waarin zowel region als category
NULLzijn, met het totale eindbedrag.
De NULL-waarden fungeren als tijdelijke aanduidingen die het samenvattingsniveau markeren.
COALESCE gebruiken om NULL-waarden te labelen
De NULL-markeringen kunnen voor eindgebruikers verwarrend zijn. Zet elke kolom in COALESCE om ze te vervangen door betekenisvolle labels, zoals 'Alle categorieën' en 'Eindtotaal'.
SELECT
COALESCE(region, 'Grand Total') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;ROLLUP met één kolom
ROLLUP werkt ook met slechts één kolom. Wanneer je ROLLUP(region) schrijft, krijg je één rij per regio, plus aan het einde één rij met het eindtotaal. Dit is de eenvoudigste vorm en is handig voor elk rapport dat onder de detailrijen een cumulatief totaal nodig heeft.
SELECT
COALESCE(region, 'Grand Total') AS region,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region)
ORDER BY region;ROLLUP met drie niveaus
Je kunt drie of meer kolommen aan ROLLUP doorgeven om diepere hiërarchieën op te bouwen. Met ROLLUP(year, region, category) krijg je subtotalen per jaar en regio, subtotalen per jaar en een eindtotaal — elke extra kolom voegt een nieuw samenvattingsniveau toe.
-- Extend the demo with a year column
SELECT
COALESCE(CAST(yr AS TEXT), 'All Years') AS year,
COALESCE(region, 'All Regions') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM (
SELECT 2024 AS yr, region, category, amount FROM sales
UNION ALL
SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP BY ROLLUP(yr, region, category)
ORDER BY yr, region, category;Samenvattingsrijen detecteren met GROUPING()
De functie GROUPING() geeft 1 terug wanneer de kolomwaarde in die rij een door ROLLUP gegenereerde NULL is, dus een tijdelijke aanduiding voor een samenvatting, en 0 wanneer het om een echte gegevenswaarde gaat. Zo kun je echte NULL-gegevens onderscheiden van NULL-waarden voor rollupsamenvattingen.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_summary,
GROUPING(category) AS is_cat_summary
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;Filteren op samenvattingsrijen
Omdat ROLLUP rijen na de aggregatie toevoegt, kun je ze niet met WHERE filteren. Gebruik HAVING of plaats de volledige query in een subquery. In het onderstaande voorbeeld blijven alleen de regionale subtotalen over: rijen waarin category een door ROLLUP gegenereerde NULL is, maar region een echte waarde heeft.
SELECT region, SUM(amount) AS regional_total
FROM sales
GROUP BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
AND GROUPING(region) = 0
ORDER BY region;ROLLUP versus GROUPING SETS
ROLLUP(a, b) is een verkorte notatie voor een specifieke verzameling GROUPING SETS. De twee onderstaande query's zijn precies equivalent — ROLLUP bespaart je het handmatig uitschrijven van elk groeperingsniveau.
-- Using ROLLUP (concise)
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);
-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS(
(region, category),
(region),
()
);Korte controle
Test je begrip van ROLLUP met deze vraag.
Samenvatting van de les
Goed gedaan! Hier volgt een samenvatting van wat je over ROLLUP hebt geleerd:
- GROUP BY ROLLUP(a, b) genereert automatisch subtotalen voor elk niveau van de kolomhiërarchie en een eindtotaal voor alle rijen.
- Samenvattingsrijen worden in de opgerolde kolommen gemarkeerd met NULL. Gebruik COALESCE om ze leesbare labels te geven.
- De functie GROUPING() geeft 1 terug voor door ROLLUP gegenereerde NULL-waarden en 0 voor echte gegevenswaarden, zodat je ze van elkaar kunt onderscheiden.
- Gebruik HAVING GROUPING(...) = 1 om alleen de samenvattingsrijen te selecteren.
- ROLLUP(a, b) is een verkorte notatie voor GROUPING SETS((a, b), (a), ()).
ROLLUP is het aangewezen hulpmiddel wanneer je rapport subtotalen en een eindtotaal nodig heeft zonder complexe UNION-query's te schrijven.
Leer SQL met een AI-tutor — gratis
Schrijf echte code en voer die uit in je browser, krijg direct hulp van een AI-tutor die 24/7 beschikbaar is en ga verder waar je gebleven bent op het web of in de app.
- Cursussen
- 46
- Lessen
- 183
Veelgestelde vragen
Is de les “ROLLUP voor subtotalen” gratis?
Ja — de volledige tekst van “ROLLUP voor subtotalen” kun je hier gratis op het web lezen. Als je interactief wilt oefenen met een ingebouwde code-editor en een AI-begeleider die 24/7 beschikbaar is, en de rest van de cursus SQL Academy wilt ontgrendelen, kun je upgraden naar CoddyKit PRO. De cursus SQL Academy bevat in totaal 4 lessen.
Wat leer ik in “ROLLUP voor subtotalen”?
Bereken lopende subtotalen en eindtotalen. Je oefent met SQL Academy door code rechtstreeks in de browser uit te voeren. Een AI-begeleider die 24/7 beschikbaar is beantwoordt je vragen terwijl je de les doorwerkt.
Heb ik ervaring nodig om met SQL Academy te beginnen?
Ervaring vooraf is niet nodig. SQL Academy op CoddyKit is opgebouwd voor beginners tot gevorderden, zodat je hier of bij het begin kunt starten en in je eigen tempo kunt leren. Dit is les 2 van 4.
Hoe lang duurt de les “ROLLUP voor subtotalen”?
De meeste lessen van CoddyKit duren ongeveer 5–10 minuten. Elke les is kort en interactief, zodat je gestaag vooruitgaat en op het web en in de app precies verdergaat waar je was gebleven.
Kan ik code schrijven en uitvoeren in deze les over SQL Academy?
Ja. Elke les over SQL Academy bevat een ingebouwde code-editor, zodat je rechtstreeks in je browser echte code kunt schrijven en uitvoeren en direct feedback van AI krijgt — lokale installatie is niet nodig.
Alle lessen in deze cursus
- Verder dan één GROUP BY
- ROLLUP voor subtotalen
- CUBE voor alle combinaties
- GROUPING SETS uitgelegd