ROLLUP per i subtotali
Calcoli subtotali progressivi e totali complessivi
ROLLUP per i subtotali è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 2 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento SQL Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso SQL Academy include 4 lezioni in totale.
Che cos'è ROLLUP?
Quando si raggruppano i dati con GROUP BY, si ottiene una riga per ogni gruppo. Spesso, però, servono anche i subtotali per ogni gruppo e un totale complessivo per tutte le righe. È esattamente ciò che fa ROLLUP.
ROLLUP è un'estensione di GROUP BY che aggiunge automaticamente righe riepilogative al set di risultati, fornendo subtotali progressivi a ogni livello della gerarchia di raggruppamento e un totale complessivo finale.
Impostazione dei dati di esempio
Creiamo una semplice tabella sales su cui fare pratica. La tabella memorizza la regione, la categoria del prodotto e l'importo della vendita per ogni transazione. Esegua le istruzioni seguenti per crearla e popolarla.
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);Prima il GROUP BY semplice
Prima di usare ROLLUP, vediamo che cosa restituisce un normale GROUP BY. La query seguente restituisce un totale per ogni coppia (region, category), senza subtotali né totale complessivo.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY region, category
ORDER BY region, category;Introduzione a GROUP BY ROLLUP
Sostituendo GROUP BY con GROUP BY ROLLUP(...), SQL aggiunge automaticamente le righe dei subtotali. Le colonne all'interno di ROLLUP() formano una gerarchia e viene prodotto un subtotale per ogni livello della gerarchia, oltre a un totale complessivo finale.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;Lettura dell'output di ROLLUP
Il risultato di ROLLUP contiene tre tipi di righe:
- Righe di dettaglio — una riga per ogni combinazione (region, category), proprio come con un GROUP BY semplice.
- Righe di subtotale — una riga per ogni region con
category = NULL, che mostra il totale della regione. - Riga del totale complessivo — una riga in cui sia region sia category sono
NULL, che mostra il totale generale.
I valori NULL fungono da segnaposto e indicano il livello riepilogato.
Uso di COALESCE per etichettare i NULL
Gli indicatori NULL possono risultare poco chiari agli utenti finali. Racchiuda ogni colonna in COALESCE per sostituirli con etichette significative, come 'Tutte le categorie' e 'Totale complessivo'.
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 su una sola colonna
ROLLUP funziona anche con una sola colonna. Scrivendo ROLLUP(region), si ottiene una riga per ogni region, più un'unica riga del totale complessivo alla fine. È la forma più semplice ed è utile per qualsiasi report che richieda un totale riepilogativo sotto le righe di dettaglio.
SELECT
COALESCE(region, 'Grand Total') AS region,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region)
ORDER BY region;ROLLUP a tre livelli
È possibile passare tre o più colonne a ROLLUP per creare gerarchie più profonde. Con ROLLUP(year, region, category) si ottengono subtotali per ogni coppia year+region, subtotali per ogni year e un totale complessivo: ogni colonna aggiuntiva introduce un ulteriore livello di riepilogo.
-- 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;Rilevare le righe di riepilogo con GROUPING()
La funzione GROUPING() restituisce 1 quando il valore della colonna nella riga è un NULL generato da ROLLUP (un segnaposto di riepilogo) e 0 quando è un valore reale dei dati. In questo modo è possibile distinguere i NULL effettivi dei dati dai NULL del riepilogo generato da ROLLUP.
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;Filtrare le righe di riepilogo
Poiché ROLLUP aggiunge righe dopo l'aggregazione, non è possibile filtrarle con WHERE. Utilizzi HAVING oppure racchiuda l'intera query in una sottoquery. L'esempio seguente mantiene soltanto i subtotali regionali, cioè le righe in cui category è un NULL generato da ROLLUP mentre region è un valore reale.
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 e GROUPING SETS
ROLLUP(a, b) è l'abbreviazione di uno specifico insieme di GROUPING SETS. Le due query seguenti sono esattamente equivalenti: ROLLUP evita semplicemente di dover scrivere manualmente ogni livello di raggruppamento.
-- 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),
()
);Verifica rapida
Metta alla prova la propria comprensione di ROLLUP con questa domanda.
Riepilogo della lezione
Ottimo lavoro! Ecco un riepilogo di ciò che ha imparato su ROLLUP:
- GROUP BY ROLLUP(a, b) genera automaticamente i subtotali per ogni livello della gerarchia delle colonne e un totale complessivo per tutte le righe.
- Le righe di riepilogo sono contrassegnate da NULL nelle colonne sottoposte a ROLLUP. Utilizzi COALESCE per assegnare loro etichette leggibili.
- La funzione GROUPING() restituisce 1 per i NULL generati da ROLLUP e 0 per i valori reali dei dati, consentendo di distinguerli.
- Utilizzi HAVING GROUPING(...) = 1 per filtrare esclusivamente le righe di riepilogo.
- ROLLUP(a, b) è l'abbreviazione di GROUPING SETS((a, b), (a), ()).
ROLLUP è lo strumento di riferimento quando un report richiede subtotali e un totale complessivo senza dover scrivere query UNION complesse.
Domande Frequenti
La lezione «ROLLUP per i subtotali» è gratuita?
Sì — il testo completo di «ROLLUP per i subtotali» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso SQL Academy, passa a CoddyKit PRO. Il corso SQL Academy include 4 lezioni in totale.
Cosa imparerò in «ROLLUP per i subtotali»?
Calcoli subtotali progressivi e totali complessivi Eserciti SQL Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.
Ho bisogno di esperienza per iniziare SQL Academy?
Non è richiesta alcuna esperienza precedente. SQL Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 2 di 4.
Quanto tempo richiede la lezione «ROLLUP per i subtotali»?
La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.
Posso scrivere ed eseguire codice in questa lezione SQL Academy?
Sì. Ogni lezione SQL Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.
Tutte le lezioni di questo corso
- Oltre un singolo GROUP BY
- ROLLUP per i subtotali
- CUBE per tutte le combinazioni
- GROUPING SETS spiegati