grouping sets

La syntaxe '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>);
Où " <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), ());
Cet exemple équivaut à un regroupement simultané par les regroupements suivants :
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.

Une entrée dans un " <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))
Ce qui équivaut à ce qui suit :
GROUPING SETS ((col1,col2), (col1), (), (col1,col2), (col1), (col2), 
())
Avec le quantificateur d'ensemble distinct suivant :
DISTINCT GROUPING SETS (ROLLUP(col1,col2), CUBE(col1,col2))
Ce qui est équivalent à ce qui suit, montrant que CUBE(<liste>) est un sur-ensemble de ROLLUP(<liste>) :
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.

Les jeux de regroupement multiples au même niveau (non imbriqués) sont traités comme dans l'exemple suivant :
GROUP BY GROUPING SETS ((A), (B)), GROUPING SETS ((X, Y), (Z))
Ce qui équivaut à ce qui suit :
GROUP BY GROUPING SETS ((A, X, Y), (A, Z), (B, X, Y), (B, Z))
Voici un autre exemple :
GROUP BY A, GROUPING SETS ((X,Y), (Z))
Ce qui équivaut à ce qui suit :
GROUP BY GROUPING SETS ((A, X, Y), (A, Z))
L'utilisation de la fonction GROUPEMENT permet de distinguer les différences. Voici un exemple de requête 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
Étant donné que certaines valeurs de colonnes de groupe sont NULL dans les lignes de superagrégats, s'il y avait une ville NULL, il pourrait être difficile de distinguer une ligne d'agrégat d'un superagrégat. En utilisant GROUPING (city), le résultat renverrait un 0 si la ville est incluse dans le "group by", et renverrait un 1 si la ville n'est pas incluse dans le "group by" L'exemple suivant montre le résultat :
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 
En utilisant GROUPING (state), le résultat renverrait un 0 si l'État est inclus dans le "group by", et renverrait un 1 si l'État n'est pas inclus dans le "group by" L'exemple suivant montre le résultat :
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