Sommario: in questo tutorial, imparerete il concetto di grouping set e come usare la clausola PostgreSQL GROUPING SETS
per generare più grouping set in una query.
Impostare una tabella di esempio
Iniziamo creando una nuova tabella chiamatasales
per la dimostrazione.
Code language: SQL (Structured Query Language) (sql)
La tabella sales
memorizza il numero di prodotti venduti per marca e segmento.
Introduzione a PostgreSQL GROUPING SETS
Un set di raggruppamento è un insieme di colonne per le quali si raggruppa usando la clausola GROUP BY
.
Un set di raggruppamento è denotato da una lista di colonne separate da virgole e messe tra parentesi:
Per esempio, la seguente query usa la clausola GROUP BY
per restituire il numero di prodotti venduti per marca e segmento. In altre parole, definisce un insieme di raggruppamento della marca e del segmento che è denotato da (brand, segement)
Code language: SQL (Structured Query Language) (sql)
La seguente query trova il numero di prodotti venduti da una marca. Definisce un insieme di raggruppamento (brand)
:
Code language: SQL (Structured Query Language) (sql)
La seguente query trova il numero di prodotti venduti per segmento. Definisce un insieme di raggruppamento (segment)
:
Code language: SQL (Structured Query Language) (sql)
La seguente query trova il numero di prodotti venduti per tutte le marche e segmenti. Definisce un insieme di raggruppamento vuoto che è denotato da ()
.
Code language: SQL (Structured Query Language) (sql)
Supponiamo che vogliate tutti gli insiemi di raggruppamento usando una sola query. Per ottenere questo, puoi usare il UNION ALL
per combinare tutte le query di cui sopra.
Perché UNION ALL
richiede che tutti i set di risultati abbiano lo stesso numero di colonne con tipi di dati compatibili, devi adattare le query aggiungendo NULL
alla lista di selezione di ciascuna come mostrato di seguito:
Code language: SQL (Structured Query Language) (sql)
Questa query genera un singolo set di risultati con gli aggregati per tutti i set di raggruppamento.
Anche se la query di cui sopra funziona come ci si aspettava, ha due problemi principali.
- In primo luogo, è piuttosto lunga.
- In secondo luogo, ha un problema di prestazioni perché PostgreSQL deve scansionare la tabella
sales
separatamente per ogni query.
Per renderlo più efficiente, PostgreSQL fornisce la clausola GROUPING SETS
che è la sottoclausola della clausola GROUP BY
.
La GROUPING SETS
permette di definire più gruppi di raggruppamento nella stessa query.
La sintassi generale del GROUPING SETS
è la seguente:
Code language: SQL (Structured Query Language) (sql)
In questa sintassi, abbiamo quattro gruppi di raggruppamento (c1,c2)
, (c1)
, (c2)
e ()
.
Per applicare questa sintassi all’esempio precedente, potete usare la clausola GROUPING SETS
al posto della clausola UNION ALL
come questa:
Code language: SQL (Structured Query Language) (sql)
Questa query è molto più corta e leggibile. Inoltre, PostgreSQL ottimizza il numero di volte che scansiona la tabella sales
e non scansiona più volte.
Funzione di raggruppamento
La funzione GROUPING()
accetta un argomento che può essere un nome di colonna o un’espressione:
Il column_name
o expression
deve corrispondere a quello specificato nella clausola GROUP BY
.
La funzione GROUPING()
restituisce il bit 0 se l’argomento è un membro del raggruppamento corrente e 1 altrimenti.
Vedi il seguente esempio:
Code language: SQL (Structured Query Language) (sql)
Come mostrato nell’immagine, quando il valore nel grouping_brand
è 0, la colonna sum
mostra il subtotale del brand
.
Quando il valore nel grouping_segment
è zero, la colonna somma mostra il subtotale del segment
.
Puoi usare la funzione GROUPING()
nella clausola HAVING
per trovare il subtotale di ogni marca in questo modo:
In questo tutorial, hai imparato a usare il PostgreSQL GROUPING SETS
per generare dei gruppi multipli.
- Questo tutorial è stato utile?
- SìNo