SQL Academy · leksjon

CUBE for alle kombinasjoner

Alle grupperingskombinasjoner samtidig.

Leksjon 3 av 413 trinn

CUBE for alle kombinasjoner er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 3 av 4. Du kan lese hele leksjonen gratis nedenfor – og deretter øve praktisk i nettleseren med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt. Den er en del av læringsløpet i SQL Academy, og fremdriften din synkroniseres mellom nettet og CoddyKit-appen. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva er CUBE?

Utvidelsen CUBE i SQL genererer alle mulige kombinasjoner av grupperinger fra en liste med kolonner. Mens ROLLUP oppretter et hierarki, produserer CUBE et fullstendig kryssprodukt av delsummer — inkludert totalsummen.

Tenk på det som å svare på: "Gi meg alle delsummer som kan beregnes ut fra disse kolonnene."

Klargjøring av tabellen

Vi bruker en sales-tabell som sporer inntekter etter år, region og produktkategori. Denne typen flerdimensjonale data er et område der CUBE virkelig kommer til sin rett.

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

Deres første CUBE-spørring

Syntaksen er enkel: Bytt ut GROUP BY med GROUP BY CUBE(...), og oppgi kolonnene inni parentesene. SQL genererer alle kombinasjoner av disse kolonnene som grupperingssett.

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

Hvor mange grupperinger produserer CUBE?

For n kolonner produserer CUBE 2n grupperingssett — ett for hvert delsett av kolonnelisten, inkludert det tomme settet (totalsummen).

Med tre kolonner (year, region, category) blir det 2³ = 8 grupperingssett: hver kolonne alene, hvert par, alle tre samlet og ingen kolonner.

-- 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 markerer den opprullede dimensjonen

Akkurat som ROLLUP bruker CUBE NULL for å signalisere at en kolonne er aggregert over. Hvis region er NULL i en resultatrad, oppsummerer raden alle regioner for den kombinasjonen av de resterende kolonnene.

Bruk GROUPING(col) for å skille en faktisk NULL-verdi fra 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;

Gjøre NULL-verdier lesbare med COALESCE

For å gjøre utdataene mer lesbare i rapporter kan De pakke hver grupperte kolonne inn i COALESCE og erstatte aggregeringsverdien NULL med en beskrivende 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 kontra ROLLUP – viktigste forskjell

ROLLUP(a, b, c) oppretter bare delsummer langs ett hierarki: (a,b,c), (a,b), (a), (). Den følger rekkefølgen fra venstre mot høyre.

CUBE(a, b, c) oppretter hvert eneste delsett — inkludert krysskombinasjoner som (a,c) eller bare (b) — som ROLLUP helt utelater. Bruk CUBE når De trenger full flerdimensjonal analyse uten et forhåndsbestemt 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);

Delvis CUBE

De kan kombinere vanlige GROUP BY-kolonner med en deliste for CUBE. Kolonner som står utenfor CUBE(...), er alltid med i hvert grupperingssett, mens bare kolonnene inni får behandling med alle kombinasjoner.

-- 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-resultater

HAVING fungerer på CUBE-resultater akkurat som med vanlig GROUP BY. De kan filtrere bort grupperingsrader der aggregatverdien ikke oppfyller en terskel – for eksempel beholde bare rader der de totale inntektene overstiger et 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;

Kombinere CUBE med vindusfunksjoner

De kan pakke inn en CUBE-spørring i en CTE og deretter bruke vindusfunksjoner til å rangere eller sammenligne rader i resultatet. Dette er et kraftig mønster for å bygge dashbord for ledelsen.

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 De bør velge CUBE

CUBE er riktig verktøy når:

  • De trenger alle kombinasjoner av delsummer for en ad hoc- eller OLAP-lignende rapport.
  • Det ikke finnes noe naturlig hierarki mellom grupperingskolonnene.
  • De vil la analytikere dele opp dataene på den måten de ønsker.

Unngå CUBE når antallet kolonner er stort – fire kolonner gir allerede 16 grupperingssett, og fem gir 32. Foretrekk ROLLUP eller eksplisitte GROUPING SETS for å holde resultatsettene håndterlige.

Hurtigsjekk

Hvor mange forskjellige grupperingssett produserer GROUP BY CUBE(a, b, c, d)?

Oppsummering av leksjonen

I denne leksjonen lærte De hvordan CUBE genererer alle mulige kombinasjoner av grupperingssett fra en kolonneliste, noe som gjør det ideelt for flerdimensjonal rapportering.

Viktige punkter:

  • GROUP BY CUBE(a, b, c) produserer 2n grupperingssett.
  • NULL i en resultatkolonne betyr at det er aggregert over denne dimensjonen; bruk GROUPING() for å oppdage dette.
  • COALESCE gjør NULL-verdier fra aggregering om til meningsfulle etiketter.
  • En delvis CUBE (for eksempel GROUP BY year, CUBE(region, category)) låser noen kolonner og bruker CUBE bare på resten.
  • Bruk CUBE til full ad hoc-analyse; foretrekk ROLLUP eller eksplisitte GROUPING SETS når hierarkiet er kjent eller antallet kolonner er stort.
Gratis å komme i gang

Lær deg SQL med en AI-veileder – gratis

Skriv og kjør ekte kode i nettleseren, få umiddelbar hjelp fra en AI-veileder som er tilgjengelig døgnet rundt, og fortsett der du slapp – på nettet eller i appen.

Kurs
46
Leksjoner
183

Ofte stilte spørsmål

Er leksjonen «CUBE for alle kombinasjoner» gratis?

Ja – hele teksten i «CUBE for alle kombinasjoner» er gratis å lese her på nettet. For å øve interaktivt med en innebygd kodeeditor og en AI-veileder som er tilgjengelig døgnet rundt, og for å låse opp resten av SQL Academy-kurset, kan du oppgradere til CoddyKit PRO. Kurset i SQL Academy inneholder totalt 4 leksjoner.

Hva lærer jeg i «CUBE for alle kombinasjoner»?

Alle grupperingskombinasjoner samtidig. Du øver på SQL Academy med praktisk kode som du kjører direkte i nettleseren, mens en AI-veileder som er tilgjengelig døgnet rundt, svarer på spørsmålene dine mens du jobber deg gjennom leksjonen.

Trenger jeg erfaring for å begynne med SQL Academy?

Ingen tidligere erfaring er nødvendig. SQL Academy på CoddyKit er lagt opp for både nybegynnere og viderekomne, så De kan begynne her eller helt fra start og lære i Deres eget tempo. Dette er leksjon 3 av 4.

Hvor lang tid tar leksjonen «CUBE for alle kombinasjoner»?

De fleste CoddyKit-leksjoner tar omtrent 5–10 minutter. Hver leksjon er kort og interaktiv, slik at De gjør jevne fremskritt og kan fortsette akkurat der De slapp – både på nettet og i appen.

Kan jeg skrive og kjøre kode i denne SQL Academy-leksjonen?

Ja. Alle SQL Academy-leksjoner har en innebygd kodeeditor, slik at De kan skrive og kjøre ekte kode direkte i nettleseren og få umiddelbar tilbakemelding fra AI – uten lokal konfigurering.

Alle leksjonene i dette kurset

  1. Utover én enkelt GROUP BY
  2. ROLLUP for delsummer
  3. CUBE for alle kombinasjoner
  4. GROUPING SETS forklart
← Tilbake til SQL Academy