grouping sets
GROUPING SETS () offre une généralisation des capacités de rollup et de cube. Toute opération " rollup() ou " cube() peut être traduite en une spécification d'ensembles de regroupement. La syntaxe est la suivante :GROUP BY [<set quantifier>] GROUPING SETS(<grouping-set-list>);<set quantifier> est soit DISTINCT, soit ALL, et par défaut ALL, et " <grouping-set-list> est une liste d'ensembles de regroupement séparés par des virgules, dont chacun est un " <grouping-col-list>" entre parenthèses, comme dans l'exemple suivant :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 ()
Le résultat du SELECT précédent est équivalent au résultat d'un UNION ALL pour les quatre selects agrégés aux quatre niveaux de groupe. Ainsi, une opération " rollup() ou " cube() peut être traduite en une spécification d'ensembles de regroupement.
<grouping-set-list> peut elle-même être un " <grouping-set-list> et peut donc également être un " cube() ou un " rollup(). Une liste d'ensembles de regroupement complexe de ce type peut toujours être développée en une liste d'ensembles de regroupement, comme dans l'exemple suivant :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), ())
En outre, l'ensemble de regroupementcol1, col2 est équivalent àcol2, col1), de sorte que l'élimination des doublons dans la liste des ensembles de regroupement se fait en mettant les entrées de la liste sous une forme canonique qui énumère les entrées uniques dans l'ordre dans lequel elles apparaissent dans la clause des ensembles de regroupement.
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