Ud over en enkelt GROUP BY
Aggregér på flere niveauer.
Ud over en enkelt GROUP BY er en gratis SQL Academy-lektion på CoddyKit. Dette er lektion 1 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.
Begrænsningen ved en enkelt GROUP BY
En standardklausul med GROUP BY lader dig aggregere rækker på ét bestemt niveau — for eksempel samlet salg pr. region. Men hvad nu hvis du også vil have totaler pr. produktkategori og en samlet total i den samme forespørgsel?
Det fungerer at gentage forespørgslen tre gange og bruge UNION ALL, men det er omstændeligt og langsomt. SQL tilbyder tre effektive udvidelser — GROUPING SETS, ROLLUP og CUBE — der løser problemet elegant i ét gennemløb.
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;Opsætning af eksempeltabellen
Gennem hele lektionen bruger vi en enkel sales-tabel, der registrerer hvert salg med et område, en kategori og et beløb. Lad os oprette og udfylde den, så alle kommende forespørgsler giver mening i deres sammenhæng.
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);Hvad er GROUPING SETS?
GROUPING SETS lader dig definere flere uafhængige grupperingsniveauer i én GROUP BY-klausul. Hvert sæt på listen producerer sin egen gruppe af rækker, præcis som hvis du havde skrevet separate forespørgsler og kombineret dem med UNION ALL.
Syntaksen er: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). Det tomme sæt () repræsenterer totalsummen for alle rækker.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);Læsning af resultatet fra GROUPING SETS
Når du kører en GROUPING SETS-forespørgsel, stables rækker fra forskellige grupperingsniveauer sammen. Kolonner, der ikke indgår i et bestemt sæt, vises som NULL i den pågældende række.
En række, der f.eks. tilhører (region)-sættet, har NULL i category-kolonnen. Det angiver, at denne total omfatter alle kategorier for området. Rækken med totalsummen (det tomme sæt) har NULL i både region og 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;Introduktion til ROLLUP
ROLLUP er en genvej til et almindeligt hierarki af grupperingssæt. For kolonnerne (A, B) genererer ROLLUP(A, B) automatisk sættene: (A, B), (A) og ().
Det er perfekt til hierarkiske data som år, måned og dag eller område og kategori. Antallet af producerede sæt er altid n + 1, hvor n er antallet af angivne kolonner.
-- 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 med tre niveauer
Hvis du tilføjer en tredje kolonne til ROLLUP, udvides hierarkiet med endnu et niveau. ROLLUP(A, B, C) genererer fire sæt: (A, B, C), (A, B), (A) og ().
I eksemplet nedenfor er year det yderste niveau, og category er det mest detaljerede. Forespørgslen producerer delsummer ved hvert trin i hierarkiet samt én række med totalsummen.
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;Introduktion til CUBE
CUBE er endnu mere omfattende end ROLLUP. For n kolonner genererer den alle 2^n mulige kombinationer af grupperingssæt, inklusive totalsummen.
For CUBE(region, category) er de producerede sæt: (region, category), (region), (category) og () — fire sæt i alt. Det er nyttigt, når du ønsker totalsummer for alle mulige tværsnit og ikke kun langs ét hierarki.
-- 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 eller ROLLUP — hvornår skal du bruge hvad
Vælg ud fra, om dine dimensioner har et naturligt hierarki:
- Brug ROLLUP, når kolonnerne er hierarkiske (f.eks. fra land til by til butik). Delsummer summeres kun op ad én vej.
- Brug CUBE, når kolonnerne er uafhængige dimensioner (f.eks. område og kategori), og du ønsker alle mulige tværsnit.
- Brug GROUPING SETS, når du har brug for fuld kontrol, og hverken ROLLUP eller CUBE opfylder dine præcise krav.
Funktionen GROUPING()
Fordi NULL enten kan betyde en reel manglende værdi eller en pladsholder for gruppering, stiller SQL funktionen GROUPING() til rådighed. Den returnerer 1, når kolonnen indgår i en superaggregeret række (pladsholder), og 0, når der faktisk blev grupperet efter kolonnen.
Det gør det muligt at skelne en ægte NULL-værdi i region fra en delsumsrække, der omfatter alle områder.
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;Brug af GROUPING() til at navngive rækker
Et almindeligt mønster er at kombinere GROUPING() med et CASE-udtryk for at generere læsevenlige navne i stedet for rå NULL-værdier. Det gør resultatet fra en ROLLUP- eller CUBE-forespørgsel meget nemmere at læse i rapporter.
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;Kombination af faste kolonner med ROLLUP
Du kan kombinere almindelige GROUP BY-kolonner med ROLLUP eller CUBE i samme klausul. Kolonner, der er angivet uden for ROLLUP(...), indgår altid i hvert grupperingssæt — de rulles aldrig op.
I forespørgslen nedenfor er year en fast grupperingskolonne, mens region og category deltager i rollup. Det betyder, at du får delsummer pr. år, ikke på tværs af alle år.
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;Hurtig test
Prøv din forståelse af GROUPING SETS, ROLLUP og CUBE.
Opsummering — ud over en enkelt GROUP BY
I denne lektion lærte du tre effektive SQL-udvidelser, der lader dig producere flere aggregeringsniveauer i én forespørgsel:
- GROUPING SETS — fuld manuel kontrol; angiv præcis de kombinationer, du har brug for.
- ROLLUP — ideel til hierarkier; summerer op fra det mest detaljerede niveau til totalsummen.
- CUBE — genererer alle mulige tværsnit af de angivne dimensioner.
Du lærte også, at GROUPING() skelner ægte NULL-værdier fra pladsholdere i superaggregerede rækker, og at mønstre med CASE GROUPING(...) giver et rent og læsbart rapportresultat.
Disse værktøjer er uundværlige, når du har brug for flerdimensionelle opsummeringer — pivotlignende rapporter, kontrolpaneler og forespørgsler til datavarehuse er alle i høj grad afhængige af dem.
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 “Ud over en enkelt GROUP BY” gratis?
Ja — hele teksten til “Ud over en enkelt GROUP BY” 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 “Ud over en enkelt GROUP BY”?
Aggregér på flere niveauer. 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 1 af 4.
Hvor lang tid tager lektionen “Ud over en enkelt GROUP BY”?
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
- Ud over en enkelt GROUP BY
- ROLLUP til delsummer
- CUBE til alle kombinationer
- GROUPING SETS forklaret