SQL Server Essentials: Utilisation de la clause GROUP BY SQL

Le langage de requête T-SQL de SQL Server offre une multitude d’options de récupération de données. Cela inclut la capacité à interroger une base de données SQL, ainsi que la fourniture d’une fonction de somme, d’une fonction d’agrégation de comptage et de regroupement de colonnes. La clause GROUP BY SQL peut tirer parti de toutes ces capacités. Dans cet article, je vais vous montrer comment la clause GROUP BY peut être utilisée seule ou en conjonction avec l’une des fonctions d’agrégation pour effectuer des calculs basés sur le regroupement.

Comment fonctionne la clause GROUP BY SQL?

La clause GROUP BY SQL est utilisée avec l’instruction SELECT pour organiser les données en groupes de données identiques. Elle suit la clause WHERE dans une instruction SELECT.

Publicité

Cette clause est le plus souvent utilisée avec des fonctions d’agrégation comme SUM, COUNT, AVG, MAX ou MIN, qui vous permettent d’effectuer des calculs avec des données groupées. Vous pouvez regrouper les données par l’un des différents types de colonnes, y compris les nombres comme les identifiants de produit, les dates, ou les caractères comme les descriptions.

La syntaxe de base de GROUP BY est assez simple:

SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;

Ici, vous pouvez voir la clause GROUP BY utilisée avec une instruction SELECT de base. L’instruction SELECT récupère deux colonnes, et la deuxième colonne utilise une fonction d’agrégation.

L’utilisation d’une fonction d’agrégation n’est pas techniquement requise, mais c’est un complément très courant à la clause GROUP BY. Le regroupement sera effectué sur les données contenues dans la première colonne.

Publicité

Plongeons plus profondément et voyons la clause GROUP BY en action.

Utilisation de GROUP BY SQL avec une instruction SELECT

Tout d’abord, regardons simplement l’utilisation de la clause GROUP BY SQL avec une simple instruction SELECT sans ajouter de fonction d’agrégation. La liste suivante récupère et groupe la colonne ‘ID Produit’ de la table SalesLT.SalesOrderDetail dans la base de données d’exemple AdventureWorksLT2019.

USE AdventureWorksLT2019;

SELECT ProductID FROM SalesLT.SalesOrderDetail
  GROUP BY ProductID;

Cela renvoie essentiellement une liste de tous les ID de produits qui ont été commandés, comme vous pouvez le voir dans la figure suivante.

We get a list of all of the ProductIDs that have been ordered (Image credit: Petri/Michael Otey)

Utilisation de GROUP BY SQL avec des fonctions d’agrégation

Il est plus courant d’utiliser la clause GROUP BY SQL avec l’une des fonctions d’agrégation qui peut vous donner un compte, un total, une moyenne ou un résumé de toutes les colonnes que vous avez regroupées. La déclaration suivante utilise GROUP BY avec la table SalesLT.Product de la base de données AdventureWorksLT2019 pour trouver le nombre total de produits dans chaque catégorie de produits:

Publicité

USE AdventureWorksLT2019;

SELECT ProductCategoryID, COUNT(*) AS TotalProducts
  FROM SalesLT.Product
   GROUP BY ProductCategoryID;

Dans cet exemple, la déclaration SELECT renvoie la colonne ‘ProductCategoryID’ de la table SalesLT.Product, et elle compte le nombre de produits dans chaque catégorie en utilisant la fonction d’agrégation COUNT(*). Ici, la clause GROUP BY regroupe les résultats par ‘ProductCategoryID’ tandis que la fonction SELECT COUNT calcule le nombre total de produits dans chaque catégorie de produits. Les résultats de la fonction COUNT(*) utilisent l’alias ‘TotalProducts’.

Les résultats de cette requête sont affichés dans la figure suivante. Cette sortie montre le nombre total de produits dans chaque catégorie de produits, tel que calculé en utilisant la clause GROUP BY. Les informations de résumé sont renvoyées par la fonction d’agrégation COUNT(*).

Using SQL GROUP BY with aggregate functions (Image credit: Petri/Michael Otey)

Utilisation de GROUP BY SQL avec plusieurs colonnes

La fonction GROUP BY SQL n’est pas limitée à travailler avec une seule colonne. Elle peut également être utilisée avec plusieurs colonnes simultanément dans la même requête.

Jetons un coup d’œil à un exemple d’utilisation de la clause GROUP BY avec deux colonnes de la table SalesLT.Product dans la base de données AdventureWorksLT2019. La requête suivante montre comment récupérer le nombre total de produits pour chaque catégorie de produit et modèle de produit.

USE AdventureWorksLT2019;

SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts
  FROM SalesLT.Product
  GROUP BY ProductCategoryID, ProductModelID;

Ici, les colonnes ‘ProductCategoryID’ et ‘ProductModelID’ sont toutes deux récupérées et nous utilisons la fonction d’agrégation COUNT(*) pour compter le nombre de produits dans chaque catégorie de produit et sous-catégorie. Dans cet exemple, la clause GROUP BY regroupe les résultats des colonnes ‘ProductCategoryID’ et ‘ProductModelID’. Cela crée deux groupes distincts basés sur les deux colonnes différentes.

Vous pouvez voir les résultats de cette requête dans la figure suivante. Ces résultats montrent le nombre total de produits et de modèles de produits, et le décompte total est récupéré en utilisant l’alias de colonne TotalProducts.

Using SQL GROUP BY with multiple columns (Image credit: Petri/Michael Otey)

Utilisation de SQL GROUP BY avec la clause HAVING

Une autre utilisation courante de la clause GROUP BY est de la combiner avec la clause HAVING. En effet, vous pouvez utiliser la clause GROUP BY avec la clause HAVING pour filtrer les résultats d’une requête en fonction des conditions appliquées par la clause HAVING aux regroupements de données. La condition peut être appliquée à une colonne de type de données régulière ou à une fonction d’agrégation.

Jetons un coup d’œil à un exemple d’utilisation de la clause GROUP BY de SQL avec la clause HAVING avec la base de données AdventureWorksLT2019. Cet exemple montre quels clients ont passé des commandes dans la table SalesLT.SalesOrderHeader avec un montant total de commande supérieur à 2000 $. Ici, la clause GROUP BY est utilisée pour regrouper les commandes par client, puis la clause HAVING filtre les clients en fonction du montant total de la commande.

USE AdventureWorksLT2019;

SELECT  c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount
  FROM SalesLT.Customer c
 JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  GROUP BY c.CustomerID, c.FirstName, c.LastName
 HAVING SUM(soh.TotalDue) > 2000;
  • Dans cette liste de code, la table SalesLT.Customer est jointe à la table SalesLT.SalesOrderHeader sur la colonne ‘CustomerID’.
  • La liste SELECT récupère les colonnes ‘CustomerID’, ‘FirstName’, ‘LastName’ et ‘TotalOrderAmount’.
  • La clause GROUP BY est utilisée pour regrouper les résultats par client.
  • La fonction d’agrégat SUM() calcule le montant total de la commande pour chaque client.
  • La clause HAVING filtre les résultats groupés pour ne sélectionner que les clients dont le montant total de la commande est supérieur à 2000 $.

Vous pouvez voir les résultats de cette liste de code dans la figure suivante :

Using SQL GROUP BY with the HAVING clause (Image credit: Petri/Michael Otey)

Utilisation de SQL GROUP BY avec la clause ORDER BY

Vous pouvez également utiliser la clause GROUP BY SQL avec la clause ORDER BY pour trier l’ensemble de résultats par une ou plusieurs colonnes. L’exemple suivant utilise la base de données AdventureWorksLT2019. Pour illustrer l’utilisation de la clause ORDER BY avec la clause GROUP BY, vous pouvez simplement prendre le code de l’exemple précédent et ajouter la clause ORDER BY pour trier les résultats affichant les montants de commande les plus élevés dans l’ordre décroissant.

USE AdventureWorksLT2019;

SELECT  c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount
  FROM SalesLT.Customer c
   JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  GROUP BY c.CustomerID, c.FirstName, c.LastName
   HAVING SUM(soh.TotalDue) > 2000
   ORDER BY TotalOrderAmount DESC;

Vous pouvez voir les résultats dans la figure suivante. Ces résultats montrent la liste des clients avec des commandes de plus de 2000 $ dans l’ordre décroissant, avec les clients ayant les commandes les plus importantes en haut.

Using SQL GROUP BY with the ORDER BY clause (Image credit: Petri/Michael Otey)

Comme vous pouvez le voir, vous pouvez faire beaucoup de choses avec la clause GROUP BY SQL. Je vous ai montré comment la clause GROUP BY peut être utilisée avec plusieurs colonnes, ainsi que comment les clauses HAVING et ORDER BY peuvent être ajoutées pour filtrer et trier les résultats.

Comme d’habitude, n’hésitez pas à poser des questions sur la clause GROUP BY SQL. Et si vous souhaitez en savoir plus sur SQL Server, n’hésitez pas à consulter les articles précédents de ma série Essentiel SQL Server.

Source:
https://petri.com/sql-group-by/