grouping sets

La sintassi " GROUPING SETS () offre una generalizzazione delle funzionalità di rollup e cubo. Qualsiasi operazione " rollup() o " cube() può essere tradotta in una specifica di set di raggruppamento. La sintassi è la seguente:
GROUP BY [<set quantifier>] GROUPING SETS(<grouping-set-list>);
Dove " <set quantifier> può essere DISTINTO o TUTTO e l'impostazione predefinita è TUTTO, mentre " <grouping-set-list> è un elenco separato da virgole di insiemi di raggruppamenti, ognuno dei quali è un " <grouping-col-list> con parentesi, come nell'esempio seguente:
SELECT col1, col2, col3, COUNT(*) FROM <table> GROUP BY GROUPING SETS 
((col1,col2), (col2,col3), (col2), ());
Questo esempio è equivalente al raggruppamento con i seguenti raggruppamenti contemporaneamente:
GROUP BY (col1, col2)
GROUP BY (col2, col3)
GROUP BY col2
GROUP BY ()

Il risultato della SELECT precedente è equivalente al risultato di una UNION ALL per le quattro select che aggregano i quattro livelli di gruppo. Quindi un'operazione " rollup() o " cube() può essere tradotta in una specifica di set di raggruppamento.

Una voce in un " <grouping-set-list> può essere a sua volta un " <grouping-set-list>, e quindi può anche essere un " cube() o un " rollup(). Un elenco di insiemi di gruppi così complesso può sempre essere espanso in un elenco di insiemi di gruppi, come nell'esempio seguente:
GROUPING SETS (ROLLUP(col1,col2), CUBE(col1,col2))
Il che equivale a quanto segue:
GROUPING SETS ((col1,col2), (col1), (), (col1,col2), (col1), (col2), 
())
Con il seguente quantificatore di insiemi distinti:
DISTINCT GROUPING SETS (ROLLUP(col1,col2), CUBE(col1,col2))
Il che è equivalente a quanto segue, dimostrando che CUBE(<lista>) è un sottoinsieme di ROLLUP(<lista>):
GROUPING SETS ((col1,col2), (col1), (col2), ())

Inoltre, l'insieme di raggruppamentocol1, col2) è equivalente acol2, col1), quindi l'eliminazione dei duplicati nell'elenco degli insiemi di raggruppamento avviene inserendo le voci dell'elenco in una forma canonica che elenca le voci uniche nell'ordine in cui si presentano nella clausola degli insiemi di raggruppamento.

Gli insiemi di raggruppamenti multipli allo stesso livello (non annidati) vengono gestiti come nell'esempio seguente:
GROUP BY GROUPING SETS ((A), (B)), GROUPING SETS ((X, Y), (Z))
Il che equivale a quanto segue:
GROUP BY GROUPING SETS ((A, X, Y), (A, Z), (B, X, Y), (B, Z))
Un altro esempio è il seguente:
GROUP BY A, GROUPING SETS ((X,Y), (Z))
Il che equivale a quanto segue:
GROUP BY GROUPING SETS ((A, X, Y), (A, Z))
L'uso della funzione Raggruppamento aiuta a distinguere le differenze. Di seguito è riportato un esempio di query di rollup:
STATE  |     CITY      |  SUM
_____________________________
 CA    | Los Angeles   |  600
 CA    | San Diego     |  225
 CA    | San Francisco |  450
 CA    |               | 1275
 MA    | Boston        |  460
 MA    | Springfield   |  345
 MA    |               |  805
       |               | 2080
Poiché alcuni valori delle colonne del gruppo sono NULL nelle righe del superaggregato, se ci fosse una città NULL, potrebbe essere difficile distinguere una riga aggregata da una superaggregata. Utilizzando GROUPING (city), il risultato restituirà uno 0 se la città è inclusa nel "group by" e un 1 se la città non è inclusa nel "group by" L'esempio seguente mostra il risultato:
STATE  |     CITY      |  SUM  | GROUPING(city) 
_____________________________________________
 CA    | Los Angeles   |  600  |       0       
 CA    | San Diego     |  225  |       0       
 CA    | San Francisco |  450  |       0       
 CA    |               | 1275  |       1       
 MA    | Boston        |  460  |       0       
 MA    | Springfield   |  345  |       0       
 MA    |               |  805  |       1       
       |               | 2080  |       1 
Utilizzando GROUPING (state), il risultato restituirà uno 0 se lo stato è incluso nel "group by" e un 1 se lo stato non è incluso nel "group by" L'esempio seguente mostra il risultato:
STATE  |     CITY      |  SUM  | GROUPING(city)  | GROUPING(state) 
________________________________________________________________
 CA    | Los Angeles   |  600  |       0         |       0
 CA    | San Diego     |  225  |       0         |       0 
 CA    | San Francisco |  450  |       0         |       0 
 CA    |               | 1275  |       1         |       0 
 MA    | Boston        |  460  |       0         |       0 
 MA    | Springfield   |  345  |       0         |       0 
 MA    |               |  805  |       1         |       0 
       |               | 2080  |       1         |       1