SQL Server GROUPING SETS
Résumé : dans ce tutoriel, vous apprendrez à utiliser le serveur SQL GROUPING SETS
pour générer plusieurs ensembles de regroupement.
Mise en place d’une table de résumé des ventes
Créons une nouvelle table nommée sales.sales_summary
pour la démonstration.
Code language: SQL (Structured Query Language) (sql)
Dans cette requête, nous récupérons les données de montant des ventes par marque et par catégorie et les alimentons dans la table sales.sales_summary
.
La requête suivante renvoie les données de la table sales.sales_summary
:
Code language: SQL (Structured Query Language) (sql)
Démarrer avec SQL Server GROUPING SETS
Par définition, un ensemble de regroupement est un groupe de colonnes par lesquelles vous regroupez. Généralement, une seule requête avec un agrégat définit un seul ensemble de regroupement.
Par exemple, la requête suivante définit un ensemble de regroupement qui inclut la marque et la catégorie qui est notée (brand, category)
. La requête renvoie le montant des ventes groupées par marque et catégorie:
Code language: SQL (Structured Query Language) (sql)
La requête suivante renvoie le montant des ventes par marque. Elle définit un ensemble de regroupement (brand)
:
Code language: SQL (Structured Query Language) (sql)
La requête suivante renvoie le montant des ventes par catégorie. Elle définit un ensemble de regroupement (category)
:
Code language: SQL (Structured Query Language) (sql)
La requête suivante définit un ensemble de regroupement vide ()
. Elle renvoie le montant des ventes pour toutes les marques et catégories.
Code language: SQL (Structured Query Language) (sql)
Les quatre requêtes ci-dessus renvoient quatre ensembles de résultats avec quatre ensembles de regroupement :
Code language: SQL (Structured Query Language) (sql)
Pour obtenir un ensemble de résultats unifié avec les données agrégées pour tous les ensembles de regroupement, vous pouvez utiliser l’opérateur UNION ALL
.
Parce que l’opérateur UNION ALL
exige que tous les ensembles de résultats aient le même nombre de colonnes, vous devez ajouter NULL
à la liste de sélection aux requêtes comme ceci:
Code language: SQL (Structured Query Language) (sql)
La requête a généré un seul résultat avec les agrégats pour tous les ensembles de regroupement comme nous l’attendions.
Cependant, elle présente deux problèmes majeurs :
- La requête est assez longue.
- La requête est lente car SQL Server doit exécuter quatre sous-requêtes et combine les ensembles de résultats en un seul.
Pour résoudre ces problèmes, SQL Server fournit une sous-clause de la clause GROUP BY
appelée GROUPING SETS
.
La GROUPING SETS
définit plusieurs ensembles de regroupement dans la même requête. Ce qui suit montre la syntaxe générale de la GROUPING SETS
:
Code language: SQL (Structured Query Language) (sql)
Cette requête crée quatre ensembles de regroupement:
Code language: SQL (Structured Query Language) (sql)
Vous pouvez utiliser cette GROUPING SETS
pour réécrire la requête qui obtient les données de vente comme suit:
Code language: SQL (Structured Query Language) (sql)
Comme vous pouvez le voir, la requête produit le même résultat que celle qui utilise l’opérateur UNION ALL
. Cependant, cette requête est beaucoup plus lisible et bien sûr plus efficace.
Fonction GROUPING
La fonction GROUPING
indique si une colonne spécifiée dans une clause GROUP BY
est agrégée ou non. Elle renvoie 1 pour agrégé ou 0 pour non agrégé dans le jeu de résultats.
Voir l’exemple de requête suivant :
Code language: SQL (Structured Query Language) (sql)
La valeur de la colonne grouping_brand
indique que la ligne est agrégée ou non, 1 signifie que le montant des ventes est agrégé par marque, 0 signifie que le montant des ventes n’est pas agrégé par marque. Le même concept est appliqué à la colonne grouping_category
.
Dans ce tutoriel, vous avez appris à générer plusieurs ensembles de regroupement dans une requête en utilisant le GROUPING SETS
.
SQL Server.