ROLLUP for delsummer
Beregn løpende delsummer og totalsummer.
ROLLUP for delsummer er en gratis leksjon i SQL Academy på CoddyKit. Dette er leksjon 2 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 ROLLUP?
Når De grupperer data med GROUP BY, får De én rad per gruppe. Men ofte ønsker De også delsummer for hver gruppe og en totalsum for alle rader. Det er nettopp dette ROLLUP gjør.
ROLLUP er en utvidelse av GROUP BY som automatisk legger til ekstra sammendragsrader i resultatsettet. De får løpende delsummer på hvert nivå i grupperingshierarkiet og en endelig totalsum til slutt.
Klargjøring av eksempeldata
La oss opprette en enkel sales-tabell som De kan øve med. Den lagrer regionen, produktkategorien og salgsbeløpet for hver transaksjon. Kjør instruksjonene nedenfor for å opprette og fylle ut tabellen.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Electronics', 300),
('East', 'Clothing', 150),
('West', 'Electronics', 700),
('West', 'Clothing', 200),
('West', 'Clothing', 100);Først vanlig GROUP BY
Før vi bruker ROLLUP, skal vi se hva en vanlig GROUP BY gir oss. Spørringen nedenfor returnerer én totalsum per par av (region, kategori) — ingen delsummer og ingen totalsum.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY region, category
ORDER BY region, category;Introduksjon til GROUP BY ROLLUP
Bytt ut GROUP BY med GROUP BY ROLLUP(...), så legger SQL automatisk til delsummerader. Kolonnene inne i ROLLUP() danner et hierarki, og det produseres en delsum for hvert nivå i hierarkiet, i tillegg til en endelig totalsum.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;Slik leses ROLLUP-utdataene
ROLLUP-resultatet inneholder tre typer rader:
- Detaljrader — én rad per kombinasjon av (region, kategori), akkurat som med vanlig GROUP BY.
- Delsumrader — én rad per region med
category = NULL, som viser totalsummen for regionen. - Totalsumrad — én rad der både region og kategori er
NULL, som viser totalsummen for alle dataene.
NULL-verdiene fungerer som plassholdere som markerer det oppsummerte nivået.
Bruke COALESCE til å merke NULL-verdier
NULL-markørene kan virke forvirrende for sluttbrukere. Pakk hver kolonne inn i COALESCE for å erstatte dem med meningsfulle etiketter som 'Alle kategorier' og 'Totalsum'.
SELECT
COALESCE(region, 'Grand Total') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;ROLLUP med én kolonne
ROLLUP fungerer også med bare én kolonne. Når De skriver ROLLUP(region), får De én rad per region samt én enkelt rad med totalsummen til slutt. Dette er den enkleste formen og er nyttig i alle rapporter som trenger en løpende totalsum under detaljradene.
SELECT
COALESCE(region, 'Grand Total') AS region,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region)
ORDER BY region;ROLLUP med tre nivåer
De kan sende tre eller flere kolonner til ROLLUP for å bygge dypere hierarkier. Med ROLLUP(year, region, category) får De delsummer per år og region, delsummer per år og en totalsum — hver ekstra kolonne legger til enda et oppsummeringsnivå.
-- Extend the demo with a year column
SELECT
COALESCE(CAST(yr AS TEXT), 'All Years') AS year,
COALESCE(region, 'All Regions') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM (
SELECT 2024 AS yr, region, category, amount FROM sales
UNION ALL
SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP BY ROLLUP(yr, region, category)
ORDER BY yr, region, category;Finne sammendragsrader med GROUPING()
Funksjonen GROUPING() returnerer 1 når kolonneverdien i raden er en NULL-verdi generert av ROLLUP (en sammendragsplassholder), og 0 når den er en faktisk dataverdi. Dermed kan De skille ekte NULL-data fra NULL-verdier i ROLLUP-sammendrag.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_summary,
GROUPING(category) AS is_cat_summary
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;Filtrere sammendragsrader
Fordi ROLLUP legger til rader etter aggregeringen, kan De ikke filtrere dem med WHERE. Bruk HAVING, eller pakk hele spørringen inn i en underspørring. Eksemplet nedenfor beholder bare delsummeradene for regionene — rader der category er en ROLLUP-NULL, mens region har en faktisk verdi.
SELECT region, SUM(amount) AS regional_total
FROM sales
GROUP BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
AND GROUPING(region) = 0
ORDER BY region;ROLLUP kontra GROUPING SETS
ROLLUP(a, b) er en kortform for et bestemt sett med GROUPING SETS. De to spørringene nedenfor er helt likeverdige — ROLLUP sparer Dem ganske enkelt for å skrive ut hvert grupperingsnivå manuelt.
-- Using ROLLUP (concise)
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),
()
);Hurtigsjekk
Test forståelsen Deres av ROLLUP med dette spørsmålet.
Oppsummering av leksjonen
Godt arbeid! Her er en oppsummering av det De har lært om ROLLUP:
- GROUP BY ROLLUP(a, b) genererer automatisk delsummer for hvert nivå i kolonnehierarkiet samt en totalsum for alle rader.
- Sammendragsrader merkes med NULL i kolonnene som er rullet opp. Bruk COALESCE for å gi dem lesbare etiketter.
- Funksjonen GROUPING() returnerer 1 for NULL-verdier generert av ROLLUP og 0 for faktiske dataverdier, slik at De kan skille dem fra hverandre.
- Bruk HAVING GROUPING(...) = 1 for å filtrere slik at bare sammendragsradene vises.
- ROLLUP(a, b) er en kortform for GROUPING SETS((a, b), (a), ()).
ROLLUP er det naturlige verktøyet når rapporten trenger delsummer og en totalsum uten at det må skrives komplekse UNION-spørringer.
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 «ROLLUP for delsummer» gratis?
Ja – hele teksten i «ROLLUP for delsummer» 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 «ROLLUP for delsummer»?
Beregn løpende delsummer og totalsummer. 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 2 av 4.
Hvor lang tid tar leksjonen «ROLLUP for delsummer»?
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
- Utover én enkelt GROUP BY
- ROLLUP for delsummer
- CUBE for alle kombinasjoner
- GROUPING SETS forklart