SQL Academy · Lektion

GROUPING SETS forklaret

Vælg præcis de grupperinger, De ønsker.

Lektion 4 af 413 trin

GROUPING SETS forklaret er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 4 af 4. Du kan læse hele lektionen gratis nedenfor — og derefter øve dig praktisk i browseren med en indbygget kodeeditor og en AI-vejleder, der er tilgængelig døgnet rundt. Den er en del af læringsforløbet i SQL Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad er GROUPING SETS?

Når du skriver en GROUP BY-sætning, definerer du ét sæt kolonner, der skal grupperes efter. Men nogle gange har du brug for flere forskellige grupperinger i én forespørgsel — uden at køre forespørgslen flere gange og bruge UNION ALL.

GROUPING SETS lader dig angive præcis, hvilke grupperinger du ønsker, alt sammen i én gennemgang af dataene. Hvert sæt på listen producerer sine egne aggregerede rækker i resultatet.

Eksempeltabel: sales

Vi bruger tabellen sales gennem hele denne lektion. Den registrerer transaktioner efter region, produktkategori og beløb.

Kør koden for at oprette og udfylde tabellen, så du kan følge med i hvert eksempel.

CREATE TABLE sales (
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Clothing',    200),
  ('West',  'Electronics', 300),
  ('West',  'Clothing',    400),
  ('North', 'Electronics', 150),
  ('North', 'Clothing',    250);

Den gamle metode: UNION ALL

Før GROUPING SETS fandtes, krævede totaler på flere niveauer, at man skrev separate forespørgsler og samlede dem med UNION ALL. Det er gentagende, sværere at læse og gennemlæser tabellen flere gange.

Eksemplet nedenfor returnerer totaler efter region og totaler efter kategori — ved hjælp af tre separate SELECT-sætninger.

SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region

UNION ALL

SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category

UNION ALL

SELECT NULL, NULL, SUM(amount)
FROM sales;

Syntaks for GROUPING SETS

Sætningen GROUPING SETS placeres inden i eller i stedet for en almindelig GROUP BY. Du angiver hver ønsket gruppering som en kolonneliste i parentes. Et tomt sæt () betyder hovedtotalen — altså ingen gruppering.

Denne ene forespørgsel gør præcis det samme som UNION ALL-forespørgslen med tre dele ovenfor, men mere kortfattet og med én gennemlæsning af tabellen.

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

Sådan læser du resultatet

Hver række i resultatet tilhører præcis ét grupperingssæt. Når en kolonne ikke indgår i det aktive grupperingssæt, er dens værdi NULL.

  • En række med region = 'East' og category = NULL tilhører sættet (region).
  • En række med region = NULL og category = 'Electronics' tilhører sættet (category).
  • En række, hvor begge værdier er NULL, er hovedtotalen fra sættet ().

Disse NULL-værdier er strukturelle — de betyder 'alle værdier' for den pågældende dimension, ikke manglende data.

GROUPING SETS med flere kolonner

Hvert grupperingssæt kan indeholde mere end én kolonne. Sættet (region, category) grupperer efter begge kolonner samlet, ligesom en almindelig GROUP BY region, category.

Når det kombineres med individuelle sæt og hovedtotalen, får du en oversigt i fire niveauer i én forespørgsel.

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

Funktionen GROUPING()

Da NULL kan betyde enten 'denne kolonne blev ikke grupperet' eller reelt manglende data, har SQL funktionen GROUPING(), som kan skelne mellem dem.

GROUPING(col) returnerer 1, når kolonnen blev udeladt fra det aktuelle grupperingssæt (dvs. dens NULL-værdi er strukturel), og 0, når kolonnen indgår i grupperingen eller har en reel NULL-værdi.

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

Erstatning af NULL-etiketter

Et almindeligt mønster er at erstatte strukturelle NULL-værdier med en beskrivende etiket, så rapporter bliver nemmere at læse. Brug CASE WHEN GROUPING(...) = 1 THEN 'Alle ...' ELSE col END til kun at indsætte etiketten i ROLLUP-rækker.

SELECT
  CASE WHEN GROUPING(region)   = 1 THEN 'All Regions'    ELSE region   END AS region,
  CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
  SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

GROUPING SETS kontra ROLLUP

ROLLUP(a, b) er en kortform, der udvides til grupperingssættene (a, b), (a), () — den tilføjer altid subtotaler langs et hierarki samt hovedtotalen.

GROUPING SETS giver dig fuld kontrol: Du vælger præcis, hvilke kombinationer der skal vises. Hvis du ikke har brug for hele hierarkiet, kan du udelade niveauer. De to forespørgsler nedenfor giver det samme resultat.

-- Using ROLLUP
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),
  ()
);

GROUPING SETS kontra CUBE

CUBE(a, b) genererer alle mulige kombinationer af de angivne kolonner: (a, b), (a), (b), (). Det er nyttigt til analyse på tværs af dimensioner, men producerer mange rækker.

GROUPING SETS lader dig kun vælge de kombinationer, du har brug for, så resultatet forbliver fokuseret, og forespørgslen hurtig.

-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);

-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

Praktisk anvendelse: Salgsdashboard

Et rigtigt dashboard har ofte brug for detaljer på rækkeniveau, subtotaler pr. afdeling og en hovedtotal i ét samlet resultatsæt. GROUPING SETS gør dette enkelt uden aggregering på applikationssiden eller flere ture til databasen.

Denne forespørgsel returnerer detaljerækker pr. region og kategori, subtotaler pr. region og én række med hovedtotalen — alt sammen sorteret, så hovedtotalen vises til sidst.

SELECT
  COALESCE(region,   'TOTAL')      AS region,
  COALESCE(category, 'ALL')        AS category,
  SUM(amount)                      AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
)
ORDER BY
  GROUPING(region),
  region NULLS LAST,
  GROUPING(category),
  category NULLS LAST;

Hurtigt tjek

Tjek din forståelse af GROUPING SETS.

Opsummering af lektionen

Dette lærte du om GROUPING SETS:

  • GROUPING SETS lader dig definere flere grupperingskombinationer i én forespørgsel og erstatter gentagende UNION ALL-mønstre.
  • Hvert sæt angives som en kolonneliste i parentes inden i GROUP BY GROUPING SETS (...). Et tomt sæt () producerer hovedtotalen.
  • Kolonner, der ikke indgår i det aktive sæt, vises som NULL i rækken — brug GROUPING(col) til at registrere disse strukturelle NULL-værdier.
  • ROLLUP og CUBE er praktiske kortformer til almindelige mønstre, men GROUPING SETS giver dig fuld og præcis kontrol over, hvilke grupperinger der medtages.
  • Kombiner med COALESCE eller CASE WHEN GROUPING(...) for at erstatte NULL-værdier med letlæselige etiketter i rapporter.
Gratis at komme i gang

Lær SQL med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
46
Lektioner
183

Ofte stillede spørgsmål

Er lektionen “GROUPING SETS forklaret” gratis?

Ja — hele teksten til “GROUPING SETS forklaret” kan læses gratis her på nettet. Hvis du vil øve dig interaktivt med en indbygget kodeeditor og en AI-vejleder døgnet rundt og få adgang til resten af SQL Academy-kurset, skal du opgradere til CoddyKit PRO. SQL Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “GROUPING SETS forklaret”?

Vælg præcis de grupperinger, De ønsker. Du øver dig i SQL Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på SQL Academy?

Der kræves ingen tidligere erfaring. SQL Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 4 af 4.

Hvor lang tid tager lektionen “GROUPING SETS forklaret”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne SQL Academy-lektion?

Ja. Alle SQL Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. Ud over en enkelt GROUP BY
  2. ROLLUP til delsummer
  3. CUBE til alle kombinationer
  4. GROUPING SETS forklaret
← Tilbage til SQL Academy