SQL Academy · Les

Verder dan één GROUP BY

Voer aggregaties uit op meerdere niveaus.

Les 1 van 413 stappen

Verder dan één GROUP BY is een gratis SQL Academy-les op CoddyKit. Dit is les 1 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.

De beperking van één GROUP BY

Met een standaardclausule GROUP BY kun je rijen op één specifiek niveau aggregeren — bijvoorbeeld de totale verkoop per regio. Maar wat als je ook totalen per productcategorie en een eindtotaal wilt, allemaal in dezelfde query?

De query drie keer herhalen en UNION ALL gebruiken werkt, maar is omslachtig en traag. SQL biedt drie krachtige uitbreidingen — GROUPING SETS, ROLLUP en CUBE — die dit probleem elegant in één doorgang oplossen.

SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;

De voorbeeldtabel aanmaken

In deze hele les gebruiken we een eenvoudige sales-tabel waarin elke verkoop wordt vastgelegd met een region, een category en een amount. We maken de tabel aan en vullen die, zodat elke volgende query in de juiste context te begrijpen is.

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);

Wat zijn GROUPING SETS?

Met GROUPING SETS kun je meerdere onafhankelijke groeperingsniveaus definiëren binnen één GROUP BY-clausule. Elke set in de lijst levert zijn eigen groep rijen op, alsof je afzonderlijke query's had geschreven en die met UNION ALL had samengevoegd.

De syntaxis is: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). De lege set () staat voor het eindtotaal over alle rijen.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

De uitvoer van GROUPING SETS lezen

Wanneer je een query met GROUPING SETS uitvoert, worden rijen van verschillende groeperingsniveaus onder elkaar gezet. Kolommen die geen deel uitmaken van een bepaalde set, verschijnen in die rij als NULL.

Een rij die bij de set (region) hoort, bevat bijvoorbeeld NULL in de kolom category. Dat geeft aan dat dit totaal alle categorieën voor die regio omvat. De rij met het eindtotaal (de lege set) bevat NULL in zowel region als category.

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;

Kennismaken met ROLLUP

ROLLUP is een afkorting voor een veelvoorkomende hiërarchie van groeperingssets. Voor de kolommen (A, B) genereert ROLLUP(A, B) automatisch de sets: (A, B), (A) en ().

Dit is ideaal voor hiërarchische gegevens, zoals van jaar naar maand naar dag, of van regio naar categorie. Het aantal gegenereerde sets is altijd n + 1, waarbij n het aantal vermelde kolommen is.

-- 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 met drie niveaus

Als je een derde kolom toevoegt aan ROLLUP, breid je de hiërarchie uit met nog een niveau. ROLLUP(A, B, C) genereert vier sets: (A, B, C), (A, B), (A) en ().

In het onderstaande voorbeeld is year het buitenste niveau en is category het meest gedetailleerde niveau. De query produceert subtotalen bij elke stap van de hiërarchie, plus één rij met het eindtotaal.

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;

Kennismaken met CUBE

CUBE is nog uitgebreider dan ROLLUP. Voor n kolommen genereert het alle 2^n mogelijke combinaties van groeperingssets, inclusief het eindtotaal.

Voor CUBE(region, category) zijn de gegenereerde sets: (region, category), (region), (category) en () — in totaal vier sets. Dit is nuttig wanneer je totalen voor elke mogelijke doorsnede wilt, en niet alleen voor één hiërarchie.

-- 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 versus ROLLUP — wanneer gebruik je welke?

Kies op basis van de vraag of je dimensies een natuurlijke hiërarchie hebben:

  • Gebruik ROLLUP wanneer de kolommen hiërarchisch zijn, bijvoorbeeld van land naar stad naar winkel. Subtotalen worden dan langs slechts één pad opgebouwd.
  • Gebruik CUBE wanneer de kolommen onafhankelijke dimensies zijn, bijvoorbeeld regio en categorie, en je elke mogelijke doorsnede wilt.
  • Gebruik GROUPING SETS wanneer je volledige controle nodig hebt en noch ROLLUP noch CUBE precies aan je vereisten voldoet.

De functie GROUPING()

Omdat NULL zowel een echt ontbrekende waarde als een tijdelijke aanduiding voor een groepering kan betekenen, biedt SQL de functie GROUPING(). Deze geeft 1 terug wanneer de kolom deel uitmaakt van een rij met een superaggregaat (een tijdelijke aanduiding), en 0 wanneer er daadwerkelijk op de kolom is gegroepeerd.

Zo kun je een echte NULL in region onderscheiden van een subtotalenrij die alle regio's omvat.

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;

GROUPING() gebruiken om rijen te labelen

Een veelgebruikt patroon is om GROUPING() te combineren met een CASE-expressie om leesbare labels voor mensen te maken in plaats van onbewerkte NULL-waarden. Daardoor is de uitvoer van een query met ROLLUP of CUBE veel gemakkelijker te lezen in rapporten.

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;

Vaste kolommen combineren met ROLLUP

Je kunt gewone kolommen van GROUP BY combineren met ROLLUP of CUBE in dezelfde clausule. Kolommen die buiten ROLLUP(...) staan, worden altijd opgenomen in elke groeperingsset — ze worden nooit opgerold.

In de onderstaande query is year een vaste groeperingskolom, terwijl region en category aan de rollup deelnemen. Daardoor krijg je subtotalen per jaar, en niet over alle jaren heen.

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;

Korte controle

Test je begrip van GROUPING SETS, ROLLUP en CUBE.

Samenvatting — verder dan één GROUP BY

In deze les heb je drie krachtige SQL-uitbreidingen geleerd waarmee je meerdere aggregatieniveaus in één query kunt produceren:

  • GROUPING SETS — volledige handmatige controle; je vermeldt precies welke combinaties je nodig hebt.
  • ROLLUP — ideaal voor hiërarchieën; rolt op van het meest gedetailleerde niveau naar het eindtotaal.
  • CUBE — genereert elke mogelijke doorsnede van de vermelde dimensies.

Je hebt ook geleerd dat GROUPING() echte NULL-waarden onderscheidt van tijdelijke rijen voor superaggregaten, en dat patronen met CASE GROUPING(...) zorgen voor nette, leesbare rapportuitvoer.

Deze hulpmiddelen zijn onmisbaar wanneer je samenvattingen over meerdere dimensies nodig hebt — rapporten in draaitabelstijl, dashboards en query's voor datawarehouses maken er allemaal intensief gebruik van.

Gratis beginnen

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 “Verder dan één GROUP BY” gratis?

Ja — de volledige tekst van “Verder dan één GROUP BY” 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 “Verder dan één GROUP BY”?

Voer aggregaties uit op meerdere niveaus. 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 1 van 4.

Hoe lang duurt de les “Verder dan één GROUP BY”?

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

  1. Verder dan één GROUP BY
  2. ROLLUP voor subtotalen
  3. CUBE voor alle combinaties
  4. GROUPING SETS uitgelegd
← Terug naar SQL Academy