CUBE för alla kombinationer
Alla grupperingskombinationer på en gång.
CUBE för alla kombinationer är en gratis lektion i SQL Academy på CoddyKit. Detta är lektion 3 av 4. Ni kan läsa hela lektionen gratis nedan och sedan öva praktiskt i webbläsaren med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt. Den ingår i lärvägen för SQL Academy, och Era framsteg synkroniseras mellan webben och CoddyKit-appen. Kursen i SQL Academy innehåller totalt 4 lektioner.
Vad är CUBE?
CUBE-tillägget i SQL genererar alla möjliga kombinationer av grupperingar från en lista med kolumner. Medan ROLLUP skapar en hierarki producerar CUBE en fullständig kombination av delsummor – inklusive totalsumman.
Tänk på det som frågan: "Beräkna alla delsummor som går att skapa från de här kolumnerna."
Konfigurera tabellen
Vi använder en sales-tabell som följer intäkter per år, region och produktkategori. Den här typen av flerdimensionella data är där CUBE verkligen kommer till sin rätt.
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);Er första CUBE-fråga
Syntaxen är enkel: ersätt GROUP BY med GROUP BY CUBE(...) och ange kolumnerna inuti parenteserna. SQL genererar alla kombinationer av dessa kolumner som grupperingsuppsättningar.
SELECT
year,
region,
category,
SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;Hur många grupperingar skapar CUBE?
För n kolumner skapar CUBE 2n grupperingsuppsättningar – en för varje delmängd av kolumnlistan, inklusive den tomma uppsättningen (totalsumman).
Med tre kolumner (year, region, category) blir det 2³ = 8 grupperingsuppsättningar: varje kolumn för sig, varje par, alla tre tillsammans och ingen kolumn alls.
-- 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 markerar den dimension som rullats upp
Precis som ROLLUP använder CUBE NULL för att visa att en kolumn har aggregerats över. Om region är NULL på en resultatrad sammanfattar raden alla regioner för den kombination av återstående kolumner.
Använd GROUPING(col) för att skilja ett faktiskt NULL-värde från en aggregeringsmarkör.
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;Göra NULL-värden lättlästa med COALESCE
För att göra resultatet mer lättläst i rapporter kan varje grupperad kolumn omslutas med COALESCE, så att aggregeringens NULL-värde ersätts med en beskrivande etikett som '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 jämfört med ROLLUP – den viktigaste skillnaden
ROLLUP(a, b, c) skapar endast delsummor längs en enda hierarki: (a,b,c), (a,b), (a), (). Den följer ordningen från vänster till höger.
CUBE(a, b, c) skapar varje delmängd – inklusive tvärsnitt som (a,c) eller enbart (b) – som ROLLUP helt hoppar över. Använd CUBE när en fullständig flerdimensionell analys behövs utan en förutbestämd hierarki.
-- 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);Partiell CUBE
Det går att kombinera vanliga GROUP BY-kolumner med en underlista för CUBE. Kolumner som anges utanför CUBE(...) finns alltid med i varje grupperingsuppsättning, medan endast kolumnerna inuti får den fullständiga kombinationsbehandlingen.
-- 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;Filtrering med HAVING på CUBE-resultat
HAVING fungerar på utdata från CUBE precis som med vanlig GROUP BY. Du kan filtrera bort grupperingsrader vars aggregerade värde inte uppfyller ett tröskelvärde – till exempel behålla endast rader där de totala intäkterna överstiger ett minimum.
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;Kombinera CUBE med fönsterfunktioner
Du kan kapsla in en CUBE-fråga i en CTE och sedan använda fönsterfunktioner för att rangordna eller jämföra rader i resultatet. Det här är ett kraftfullt mönster för att bygga dashboards för ledningsnivå.
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;När ska du välja CUBE
CUBE är rätt verktyg när:
- Du behöver alla kombinationer av delsummor för en ad hoc- eller OLAP-liknande rapport.
- Det inte finns någon naturlig hierarki bland dina grupperingskolumner.
- Du vill låta analytiker dela upp data på valfritt sätt.
Undvik CUBE när antalet kolumner är stort – 4 kolumner ger redan 16 grupperingsuppsättningar och 5 ger 32. Föredra ROLLUP eller explicita GROUPING SETS för att hålla resultatmängderna hanterbara.
Snabbtest
Hur många distinkta grupperingsuppsättningar producerar GROUP BY CUBE(a, b, c, d)?
Sammanfattning av lektionen
I den här lektionen lärde du dig hur CUBE genererar alla möjliga kombinationer av grupperingsuppsättningar från en kolumnlista, vilket gör det idealiskt för flerdimensionell rapportering.
Viktiga punkter:
GROUP BY CUBE(a, b, c)producerar 2n grupperingsuppsättningar.NULLi en resultatkolumn betyder att den dimensionen aggregerades över; användGROUPING()för att upptäcka detta.COALESCEomvandlar aggregeradeNULL-värden till meningsfulla etiketter.- En partiell
CUBE(till exempelGROUP BY year, CUBE(region, category)) låser vissa kolumner och använder cube endast på de återstående. - Använd
CUBEför fullständig ad hoc-analys. FöredraROLLUPeller explicitaGROUPING SETSnär hierarkin är känd eller antalet kolumner är stort.
Lär dig SQL med en AI-lärare – gratis
Skriv och kör riktig kod i webbläsaren, få omedelbar hjälp av en AI-lärare dygnet runt och fortsätt där du slutade – på webben eller i appen.
- Kurser
- 46
- Lektioner
- 183
Vanliga frågor
Är lektionen ”CUBE för alla kombinationer” gratis?
Ja – hela texten till ”CUBE för alla kombinationer” kan läsas gratis här på webben. Om Ni vill öva interaktivt med en inbyggd kodredigerare och en AI-handledare som är tillgänglig dygnet runt och låsa upp resten av kursen i SQL Academy, kan Ni uppgradera till CoddyKit PRO. Kursen i SQL Academy innehåller totalt 4 lektioner.
Vad lär jag mig i ”CUBE för alla kombinationer”?
Alla grupperingskombinationer på en gång. Ni övar på SQL Academy med praktisk kod som körs direkt i webbläsaren, medan en AI-handledare som är tillgänglig dygnet runt svarar på Era frågor under lektionen.
Behöver jag någon erfarenhet för att börja lära mig SQL Academy?
Du behöver inga förkunskaper. Utbildningen i SQL Academy på CoddyKit är upplagd för allt från nybörjare till avancerade elever, så att du kan börja här eller från början och gå fram i din egen takt. Detta är lektion 3 av 4.
Hur lång tid tar lektionen ”CUBE för alla kombinationer”?
De flesta CoddyKit-lektioner tar cirka 5–10 minuter. Varje lektion är kort och interaktiv, så att du gör stadiga framsteg och kan fortsätta precis där du slutade – på webben eller i appen.
Kan jag skriva och köra kod i den här SQL Academy-lektionen?
Ja. Varje SQL Academy-lektion innehåller en inbyggd kodredigerare, så att du kan skriva och köra riktig kod direkt i webbläsaren och få omedelbar AI-feedback – utan lokal installation.
Alla lektioner i den här kursen
- Bortom en enda GROUP BY
- ROLLUP för delsummor
- CUBE för alla kombinationer
- GROUPING SETS förklarat