PostgreSQL GROUPING SETS

author
2 minutes, 58 seconds Read

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

Similar Posts

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.