0Pricing
SQL Academy · Lezione

GROUPING SETS spiegati

Scelga esattamente i raggruppamenti desiderati

GROUPING SETS spiegati è una lezione SQL Academy gratuita su CoddyKit. Questa è la lezione 4 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 cosa sono i GROUPING SETS?

Quando si scrive una clausola GROUP BY, si definisce un unico set di colonne per il raggruppamento. A volte, però, è necessario eseguire più raggruppamenti diversi in un'unica query, senza eseguire la query più volte e usare UNION ALL.

GROUPING SETS consente di specificare esattamente i raggruppamenti desiderati, eseguendo tutto in un'unica scansione dei dati. Ogni set dell'elenco produce nel risultato le proprie righe aggregate.

Tabella di esempio: sales

In questa lezione verrà utilizzata una tabella sales. La tabella registra transazioni per regione, categoria di prodotto e importo.

Esegua il codice per creare e popolare la tabella, così potrà seguire ogni esempio.

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

Il metodo tradizionale: UNION ALL

Prima dell'introduzione di GROUPING SETS, per ottenere i totali a più livelli era necessario scrivere query separate e concatenarle con UNION ALL. Questo approccio è ripetitivo, più difficile da leggere e richiede più scansioni della tabella.

L'esempio seguente restituisce sia i totali per regione sia i totali per categoria, usando tre istruzioni SELECT separate.

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;

Sintassi di GROUPING SETS

La clausola GROUPING SETS viene inserita all'interno di un normale GROUP BY o al suo posto. Si elenca ciascun raggruppamento desiderato come un elenco di colonne tra parentesi. Un set vuoto () indica il totale complessivo, cioè nessun raggruppamento.

Questa singola query esegue esattamente quanto faceva la UNION ALL in tre parti precedente, ma in modo più conciso e con una sola scansione della tabella.

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

Interpretare il risultato

Ogni riga dell'output appartiene esattamente a un set di raggruppamento. Quando una colonna non fa parte del set di raggruppamento attivo, il suo valore è NULL.

  • Una riga con region = 'East' e category = NULL appartiene al set (region).
  • Una riga con region = NULL e category = 'Electronics' appartiene al set (category).
  • Una riga in cui entrambe le colonne sono NULL rappresenta il totale complessivo del set ().

Questi NULL sono strutturali: indicano "tutti i valori" per quella dimensione, non dati mancanti.

Set di raggruppamento con più colonne

Ogni set di raggruppamento può contenere più di una colonna. Il set (region, category) raggruppa per entrambe le colonne, proprio come un semplice GROUP BY region, category.

Combinandolo con i set singoli e con il totale complessivo, si ottiene un riepilogo su quattro livelli in un'unica query.

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

La funzione GROUPING()

Poiché NULL può indicare sia che una colonna non è stata raggruppata sia che contiene dati realmente mancanti, SQL mette a disposizione la funzione GROUPING() per distinguere i due casi.

GROUPING(col) restituisce 1 quando la colonna è stata omessa dal set di raggruppamento corrente, cioè quando il suo NULL è strutturale, e 0 quando la colonna fa parte del raggruppamento o contiene un valore NULL reale.

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

Sostituire le etichette NULL

Un approccio comune consiste nel sostituire i NULL strutturali con un'etichetta descrittiva, per rendere più leggibili i report. Usi CASE WHEN GROUPING(...) = 1 THEN 'All ...' ELSE col END per sostituire l'etichetta solo nelle righe di riepilogo.

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 e ROLLUP

ROLLUP(a, b) è una scorciatoia che si espande nei set di raggruppamento (a, b), (a), (): aggiunge sempre i subtotali lungo una gerarchia e il totale complessivo.

GROUPING SETS offre il pieno controllo: è possibile scegliere esattamente quali combinazioni visualizzare. Se non serve l'intera gerarchia, si possono omettere alcuni livelli. Le due query seguenti producono lo stesso output.

-- 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 e CUBE

CUBE(a, b) genera ogni possibile combinazione delle colonne elencate: (a, b), (a), (b), (). È utile per l'analisi tra dimensioni, ma produce molte righe.

GROUPING SETS consente di selezionare solo le combinazioni di interesse, mantenendo il risultato focalizzato e la query veloce.

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

Caso d'uso pratico: dashboard delle vendite

Una dashboard reale spesso richiede il dettaglio a livello di riga, i subtotali per reparto e un totale complessivo, tutto nello stesso set di risultati. GROUPING SETS rende questa operazione semplice, senza aggregazioni lato applicazione o più round trip.

Questa query restituisce righe di dettaglio per regione e categoria, subtotali solo per regione e un'unica riga con il totale complessivo, ordinando tutto in modo che il totale complessivo appaia per ultimo.

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;

Verifica rapida

Metta alla prova la propria comprensione di GROUPING SETS.

Riepilogo della lezione

Ecco che cosa ha appreso su GROUPING SETS:

  • GROUPING SETS consente di definire più combinazioni di raggruppamento in un'unica query, sostituendo i ripetitivi schemi basati su UNION ALL.
  • Ogni set viene elencato come un elenco di colonne tra parentesi all'interno di GROUP BY GROUPING SETS (...). Un set vuoto () produce il totale complessivo.
  • Le colonne che non appartengono al set attivo vengono visualizzate come NULL in quella riga: usi GROUPING(col) per rilevare questi NULL strutturali.
  • ROLLUP e CUBE sono scorciatoie pratiche per gli schemi più comuni, mentre GROUPING SETS offre un controllo completo e preciso sui raggruppamenti inclusi.
  • Combini GROUPING SETS con COALESCE o CASE WHEN GROUPING(...) per sostituire i NULL con etichette leggibili nei report.

Domande Frequenti

La lezione «GROUPING SETS spiegati» è gratuita?

Sì — il testo completo di «GROUPING SETS spiegati» è 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 «GROUPING SETS spiegati»?

Scelga esattamente i raggruppamenti desiderati 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 4 di 4.

Quanto tempo richiede la lezione «GROUPING SETS spiegati»?

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

  1. Oltre un singolo GROUP BY
  2. ROLLUP per i subtotali
  3. CUBE per tutte le combinazioni
  4. GROUPING SETS spiegati
← Torna a SQL Academy