SQL Academy · Les

CUBE voor alle combinaties

Alle combinaties van groeperingen tegelijk.

Les 3 van 413 stappen

CUBE voor alle combinaties is een gratis SQL Academy-les op CoddyKit. Dit is les 3 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 CUBE?

De CUBE-uitbreiding in SQL genereert elke mogelijke combinatie van groeperingen uit een lijst met kolommen. Waar ROLLUP een hiërarchie maakt, produceert CUBE een volledige kruiscombinatie van subtotalen — inclusief het eindtotaal.

Je kunt het zien als het antwoord op de vraag: ‘Geef me elk subtotaal dat je met deze kolommen kunt berekenen.’

De tabel instellen

We gebruiken een sales-tabel waarin de omzet per jaar, regio en productcategorie wordt bijgehouden. Dit soort gegevens met meerdere dimensies is precies waar CUBE in uitblinkt.

CREATE TABLE sales (
  year     INT,
  region   VARCHAR(20),
  category VARCHAR(20),
  revenue  NUMERIC(10,2)
);

INSERT INTO sales VALUES
  (2023, 'North', 'Electronics', 12000),
  (2023, 'North', 'Clothing',     8000),
  (2023, 'South', 'Electronics',  9500),
  (2023, 'South', 'Clothing',     6000),
  (2024, 'North', 'Electronics', 14000),
  (2024, 'North', 'Clothing',     9500),
  (2024, 'South', 'Electronics', 11000),
  (2024, 'South', 'Clothing',     7200);

Je eerste CUBE-query

De syntaxis is eenvoudig: vervang GROUP BY door GROUP BY CUBE(...) en vermeld de kolommen tussen de haakjes. SQL genereert alle combinaties van deze kolommen als groeperingssets.

SELECT
  year,
  region,
  category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;

Hoeveel groeperingen produceert CUBE?

Voor n kolommen produceert CUBE 2n groeperingssets — één voor elke deelverzameling van de kolommenlijst, inclusief de lege set (het eindtotaal).

Met 3 kolommen (jaar, regio, categorie) zijn dat 2³ = 8 groeperingssets: elke kolom afzonderlijk, elk paar, alle drie samen en geen enkele kolom.

-- 3 columns => 8 grouping sets:
-- (year, region, category)
-- (year, region)
-- (year, category)
-- (region, category)
-- (year)
-- (region)
-- (category)
-- () <- grand total
SELECT COUNT(*) AS row_count
FROM (
  SELECT year, region, category, SUM(revenue)
  FROM sales
  GROUP BY CUBE(year, region, category)
) sub;

NULL-waarden markeren de opgerolde dimensie

Net als ROLLUP gebruikt CUBE NULL om aan te geven dat er over een kolom is geaggregeerd. Als region in een resultaatrij NULL is, vat die rij alle regio's samen voor de combinatie van de overige kolommen.

Gebruik GROUPING(col) om een echte NULL-waarde te onderscheiden van een aggregatiemarkering.

SELECT
  GROUPING(year)     AS g_year,
  GROUPING(region)   AS g_region,
  GROUPING(category) AS g_category,
  year,
  region,
  category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY g_year, g_region, g_category;

NULL-waarden leesbaar maken met COALESCE

Maak de uitvoer leesbaarder in rapporten door elke gegroepeerde kolom in COALESCE te zetten. Zo vervang je de aggregatie-NULL door een beschrijvend label zoals 'ALL'.

SELECT
  COALESCE(CAST(year AS VARCHAR), 'ALL YEARS')     AS year,
  COALESCE(region,   'ALL REGIONS')                AS region,
  COALESCE(category, 'ALL CATEGORIES')             AS category,
  SUM(revenue)                                     AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;

CUBE versus ROLLUP — belangrijkste verschil

ROLLUP(a, b, c) maakt alleen subtotalen langs één hiërarchie: (a,b,c), (a,b), (a), (). De volgorde van links naar rechts blijft behouden.

CUBE(a, b, c) maakt elke deelverzameling, inclusief doorsneden zoals (a,c) of alleen (b), die ROLLUP volledig overslaat. Gebruik CUBE wanneer je volledige multidimensionale analyse nodig hebt zonder vooraf bepaalde hiërarchie.

-- ROLLUP: 4 grouping sets
SELECT year, region, SUM(revenue)
FROM sales
GROUP BY ROLLUP(year, region);

-- CUBE: 4 grouping sets for 2 columns (same count here)
-- but adds the (region) subtotal that ROLLUP omits
SELECT year, region, SUM(revenue)
FROM sales
GROUP BY CUBE(year, region);

Gedeeltelijke CUBE

Je kunt gewone kolommen van GROUP BY combineren met een deel-lijst voor CUBE. Kolommen die buiten CUBE(...) staan, zijn altijd aanwezig in elke groeperingsset, terwijl alleen de kolommen binnen de CUBE-behandeling alle combinaties krijgen.

-- year is fixed; CUBE only over region and category
SELECT
  year,
  COALESCE(region,   'ALL REGIONS')    AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY year, CUBE(region, category)
ORDER BY year, region, category;

Filteren met HAVING op CUBE-resultaten

HAVING werkt op uitvoer van CUBE precies zoals bij een gewone GROUP BY. Je kunt groeperingsrijen wegfilteren waarvan de geaggregeerde waarde niet aan een drempel voldoet — bijvoorbeeld door alleen rijen te behouden waarvan de totale omzet boven een minimum ligt.

SELECT
  COALESCE(region,   'ALL REGIONS')    AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(region, category)
HAVING SUM(revenue) > 15000
ORDER BY total_revenue DESC;

CUBE combineren met vensterfuncties

Je kunt een CUBE-query in een CTE verpakken en vervolgens vensterfuncties toepassen om rijen binnen het resultaat te rangschikken of te vergelijken. Dit is een krachtig patroon voor het bouwen van dashboards voor leidinggevenden.

WITH cube_result AS (
  SELECT
    COALESCE(region,   'ALL') AS region,
    COALESCE(category, 'ALL') AS category,
    SUM(revenue) AS total_revenue
  FROM sales
  GROUP BY CUBE(region, category)
)
SELECT
  region,
  category,
  total_revenue,
  RANK() OVER (ORDER BY total_revenue DESC) AS revenue_rank
FROM cube_result
ORDER BY revenue_rank;

Wanneer kies je voor CUBE?

CUBE is de juiste keuze wanneer:

  • Je elke combinatie van subtotalen nodig hebt voor een ad-hoc- of OLAP-achtig rapport.
  • Er geen natuurlijke hiërarchie bestaat tussen je groeperingskolommen.
  • Je analisten de gegevens op elke gewenste manier wilt laten uitsplitsen.

Vermijd CUBE wanneer het aantal kolommen groot is — 4 kolommen leveren al 16 groeperingssets op en 5 kolommen 32. Gebruik liever ROLLUP of expliciete GROUPING SETS om resultaatsets beheersbaar te houden.

Korte toets

Hoeveel verschillende groeperingssets levert GROUP BY CUBE(a, b, c, d) op?

Lesoverzicht

In deze les heb je geleerd hoe CUBE elke mogelijke combinatie van groeperingssets uit een lijst kolommen genereert, waardoor het ideaal is voor rapportages met meerdere dimensies.

Belangrijkste punten:

  • GROUP BY CUBE(a, b, c) levert 2n groeperingssets op.
  • NULL in een resultaatkolom betekent dat over die dimensie is geaggregeerd; gebruik GROUPING() om dit te detecteren.
  • COALESCE zet aggregatie-NULLs om in betekenisvolle labels.
  • Een gedeeltelijke CUBE (bijvoorbeeld GROUP BY year, CUBE(region, category)) houdt bepaalde kolommen vast en past CUBE alleen toe op de rest.
  • Gebruik CUBE voor volledige ad-hocanalyse; geef de voorkeur aan ROLLUP of expliciete GROUPING SETS wanneer de hiërarchie bekend is of het aantal kolommen groot is.
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 “CUBE voor alle combinaties” gratis?

Ja — de volledige tekst van “CUBE voor alle combinaties” 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 “CUBE voor alle combinaties”?

Alle combinaties van groeperingen tegelijk. 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 3 van 4.

Hoe lang duurt de les “CUBE voor alle combinaties”?

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