TOP

SQL-Leçon 8. Regroupement de données (GROUP BY)

Le regroupement de données vous permet de diviser toutes les données en ensembles logiques, ce qui permet d'effectuer des calculs statistiques séparément dans chaque groupe.


1. Création de groupes (GROUP BY)

Les groupes sont créés à l'aide de l'instruction GROUP BY de l'opérateur SELECT. Prenons un exemple.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

Avec cette demande, nous avons extrait des informations sur le nombre de produits vendus chaque mois. L'opérateur SELECT ordonne d'afficher deux colonnes Product - le nom du produit et Product_num - le champ calculé que nous avons créé pour afficher la quantité de produits vendus (formule de champ SUM(Quantity)). La clause GROUP BY indique au SGBD de regrouper les données par colonne Produit.

Il convient également de noter que GROUP BY doit venir après la clause WHERE et avant ORDER BY.

2. Filtrage des groupes (HAVING)

Tout comme nous filtrons les lignes d’un tableau, nous pouvons filtrer sur des données groupées. Pour cela, il existe l'opérateur HAVING en SQL. Prenons l'exemple précédent et ajoutons un filtrage de groupe.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Nous voyons qu'après avoir calculé le nombre de marchandises vendues pour chaque produit, le SGBD "a coupé" les produits vendus à moins de 4 000 unités.

Comme vous pouvez le voir, l'opérateur HAVING est très similaire à l'opérateur WHERE, mais il existe une différence significative entre eux : WHERE filtre les données avant qu'elles ne soient regroupées, et HAVING les filtre après le regroupement. Ainsi, les lignes supprimées par la clause WHERE ne seront pas incluses dans le groupe. Ainsi, les opérateurs WHERE et HAVING peuvent être utilisés dans la même phrase. Prenons un exemple :

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Nous avons ajouté l'opérateur WHERE à l'exemple précédent, où nous avons spécifié le produit "Skis Long", ce qui a à son tour affecté le regroupement par l'opérateur HAVING. De ce fait, on constate que le produit « Skis Longs » ne figure pas dans la liste des groupes comptant plus de 4 000 produits vendus.

3. Regroupement et tri

Comme pour l'échantillonnage normal des données, nous pouvons trier les groupes après regroupement avec l'opérateur HAVING. Pour cela, nous pouvons utiliser l'opérateur déjà familier ORDER BY. Dans cette situation, son application est similaire aux exemples précédents. Exemple:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

ou précisez simplement le numéro du champ dans l'ordre dans lequel on souhaite trier :

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

On voit que pour trier les résultats récapitulatifs, il suffit d'écrire la clause avec ORDER BY après l'opérateur HAVING.

MS Access ne prend pas en charge le tri des groupes par alias de colonnes, c'est-à-dire que dans notre exemple, pour trier les valeurs, nous ne pourrons pas écrire ORDER BY Product_num à la fin de la requête.