grouping sets
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>);<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), ());
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.
<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))
GROUPING SETS ((col1,col2), (col1), (), (col1,col2), (col1), (col2),
())
DISTINCT GROUPING SETS (ROLLUP(col1,col2), CUBE(col1,col2))
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.
GROUP BY GROUPING SETS ((A), (B)), GROUPING SETS ((X, Y), (Z))
GROUP BY GROUPING SETS ((A, X, Y), (A, Z), (B, X, Y), (B, Z))
GROUP BY A, GROUPING SETS ((X,Y), (Z))
GROUP BY GROUPING SETS ((A, X, Y), (A, Z))
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
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
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