Retour à la liste des articles Articles
11 minutes de lecture

Comment utiliser GROUP BY en SQL

Dans cet article, nous vous proposons un guide étape par étape de l'utilisation de GROUP BY en SQL. Découvrez les nuances de la fonction GROUP BY et apprenez les différentes façons de l'utiliser.

GROUP BY est l'une des clauses les plus utilisées en SQL. Elle vous permet de passer de la simple sélection de données dans la base de données au regroupement des lignes ayant les mêmes valeurs de colonne dans un même groupe. Lorsqu'elle est utilisée avec les fonctions d'agrégation de SQL, vous pouvez utiliser GROUP BY pour calculer des paramètres tels que le nombre d'instances ou la valeur totale, moyenne, minimale ou maximale.

GROUP BY fait partie des connaissances de base de SQL ; vous devez vous sentir vraiment à l'aise avec lui avant de passer à des concepts plus compliqués.

Vous savez déjà que l'écriture de code s'apprend mieux par la pratique. Trouver l'occasion d'écrire régulièrement du code SQL peut s'avérer délicat si vous ne travaillez pas quotidiennement avec SQL. Difficile, mais pas impossible. Ce qui rend la chose possible, c'est le Exercices Pratiques de SQL cours. Ses 88 exercices offrent de nombreuses occasions de pratiquer GROUP BY et d'autres concepts SQL, tels que les fonctions d'agrégation, les JOIN et les sous-requêtes.

Comment fonctionne GROUP BY ? Un exemple

Je vais utiliser le tableau typewriter_products pour démontrer l'importance de la clause GROUP BY en SQL. Elle présente les articles que vous pouvez acheter auprès d'une entreprise fictive qui vend des produits liés aux machines à écrire. Pour ceux qui se posent la question, il s'agit d'une machine à écrire :

Comment utiliser GROUP BY en SQL

Source : https://i.etsystatic.com/8429430/r/il/132716/1789166606/il_fullxfull.1789166606_1qnc.jpg

Presque comme un ordinateur sans écran. Qui sait combien de livres importants ont été écrits à l'aide d'une machine à écrire. Les livres, vous vous en souvenez ?

(Mais ça suffit avec la suffisance ! Parlons de la table !)

Oui, le tableau. Elle comporte les colonnes suivantes :

  • id - L'identifiant unique de l'enregistrement.
  • product_name - Le nom du produit.
  • product_id - L'identifiant du produit.
  • ribbon_brand - La marque du ruban de la machine à écrire.
  • typewriter_brand - La marque de la machine à écrire pour laquelle le ruban est conçu.
  • ribbon_color - La couleur du ruban de la machine à écrire.
  • units - Le nombre d'unités disponibles du produit.
  • price - Le prix unitaire du produit.

Les données elles-mêmes sont présentées ci-dessous.

idproduct_nameproduct_idribbon_brandtypewriter_brandribbon_colorunitsprice
1typewriter ribbon1All You NeedOlympiaBlack8810.00
2typewriter ribbon1All You NeedOlympiaBlack + Red4810.00
3typewriter ribbon2Ribbons & UsOlympiaBlack9712.39
4typewriter ribbon2Ribbons & UsOlympiaBlack + Red14715.15
5typewriter ribbon3All You NeedUnderwoodBlack1424.74
6typewriter ribbon3All You NeedUnderwoodBlack + Red1325.17
7typewriter ribbon4Our RibbonUnderwoodBlack5425.00
8typewriter ribbon5Ribbons & UsUnderwoodBlack15730.47
9typewriter ribbon5Ribbons & UsUnderwoodBlack + Red1428.47
10typewriter ribbon6All You NeedAdlerBlack4420.00
11typewriter ribbon6All You NeedAdlerBlack + Red1630.00
12typewriter ribbon7Ribbons & UsAdlerBlack5424.69
13typewriter ribbon7Ribbons & UsAdlerBlack + Red2730.30

Avec ce tableau, vous pouvez obtenir plusieurs groupes. Par exemple, vous pouvez calculer le prix moyen d'un produit selon la marque de la machine à écrire.

Voici la requête qui permettra de le faire :

SELECT typewriter_brand,
 AVG(price) AS average_price
FROM typewriter_products
GROUP BY typewriter_brand;

Cette requête regroupe les données par la marque de la machine à écrire et calcule le prix moyen. La requête produira ce tableau :

typewriter_brandaverage_price
Adler26.25
Olympia11.89
Underwood26.77

La sortie montre trois types de marques de machines à écrire et le prix moyen du produit pour chaque machine à écrire.

Vous pouvez également trouver le nombre de rubans disponibles par couleur avec cette requête :

SELECT ribbon_color,
	 SUM(units) AS sum_units
FROM typewriter_products
GROUP BY ribbon_color;

Le groupe dans cette requête est la couleur du ruban. J'utilise également la fonction d'agrégation SUM() pour additionner le nombre d'unités par couleur de ruban. Voici le résultat :

ribbon_colorsum_units
Black508
Black + Red265

Les données sont regroupées en deux lignes : ruban noir et ruban noir + rouge. Pour chaque couleur de ruban, il y a un nombre d'unités disponibles à la vente.

Voici un aperçu de ce que fait GROUP BY et comment il fonctionne. Comme vous pouvez le constater, la syntaxe GROUP BY est relativement simple. Si vous avez besoin de plus de précisions sur la syntaxe GROUP BY, consultez cet article.

Comment pouvez-vous écrire vos propres requêtes et utiliser la clause GROUP BY ? Voici quelques conseils pour vous aider.

Étapes de l'utilisation de GROUP BY

Comment utiliser GROUP BY en SQL ? Je vais vous donner une recette étape par étape dans cette section. Imaginons que je veuille trouver le nombre d'enregistrements pour chaque produit.

Lapremière étape de l'écriture d'une requête doit consister à trouver une colonne de regroupement adéquate. Dans ce cas, il s'agit de product_id. Nous plaçons cette colonne dans la clause GROUP BY :

SELECT
…
GROUP BY product_id;

Ladeuxième étape consiste à choisir la bonne fonction d'agrégation et à l'utiliser dans l'instruction SELECT. Comme notre objectif est de trouver le nombre d'enregistrements, nous utilisons la fonction COUNT(). Bien entendu, vous devez également spécifier la colonne dans la clause FROM:

SELECT COUNT(*)
FROM typewriter_products
GROUP BY product_id;

Cette requête sera-t-elle exécutée ? Bien sûr ! Elle renverra ce résultat.

count
2
2
1
2
2
2
2

Comme vous pouvez le constater, ce n'est pas très utile. Tous les produits ont deux enregistrements sauf un, mais quels sont ces produits ? Nous n'en avons aucune idée !

C'est pourquoi la troisième étape est importante. Dans cette étape, écrivez la colonne de regroupement dans le SELECT, aussi :

SELECT product_id,
	 COUNT(*)
FROM typewriter_products
GROUP BY product_id
ORDER BY product_id; 

Maintenant, la requête affichera ce résultat.

product_idcount
12
22
32
41
52
62
72

C'est beaucoup plus utile, non ? Vous savez maintenant que le produit avec l'ID 4 n'a qu'une seule occurrence dans la table. Vous avez probablement remarqué que j'ai utilisé COUNT(*) dans les requêtes ci-dessus. Ce n'est pas la seule façon d'utiliser cette fonction d'agrégation. Vous pouvez également découvrir toutes les options d'utilisation de COUNT().

En comparant les deux requêtes ci-dessus, vous pouvez voir qu'il est possible d'utiliser une colonne dans GROUP BY mais de ne pas l'utiliser dans SELECT; le regroupement fonctionne toujours.

Et si vous utilisiez la colonne dans l'instruction SELECT mais pas dans le GROUP BY ? Non, vous ne pouvez pas faire cela. La règle générale est la suivante : Si la colonne se trouve dans SELECT et n'est pas utilisée dans une fonction d'agrégation, elle doit figurer dans la clause GROUP BY. Voici quelques détails supplémentaires sur cette règle.

Autres conseils pour l'utilisation de GROUP BY en SQL

Bien que l'utilisation de GROUP BY semble plutôt facile (et elle l'est !), il existe d'autres conseils et astuces qui rendront son utilisation beaucoup plus confortable.

Utilisez un identificateur unique

Lorsque vous choisissez la colonne par laquelle regrouper, vous devez généralement utiliser la colonne qui identifie le groupe de manière unique. Si vous ne le faites pas, le résultat obtenu peut être trompeur ou tout simplement erroné.

Par exemple, affichons les produits par marque de machine à écrire mais essayons de regrouper les données par nom de produit. La requête ...

SELECT product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_name, typewriter_brand
ORDER BY typewriter_brand;

... produira le tableau suivant :

product_nametypewriter_brandproduct_count
typewriter ribbonAdler4
typewriter ribbonOlympia4
typewriter ribbonUnderwood5

Si vous regroupiez les données de cette manière, vous auriez la fausse impression qu'il n'y a qu'un seul produit pour chacune des trois marques de machines à écrire - un produit apparaissant quatre fois pour les machines à écrire Adler et Olympia et cinq fois pour Underwood.

Et si vous utilisiez la colonne product_id au lieu de product_name ?

SELECT product_id,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, typewriter_brand
ORDER BY typewriter_brand;

Vous voyez maintenant que le résultat est un peu différent :

product_idtypewriter_brandproduct_count
6Adler2
7Adler2
1Olympia2
2Olympia2
3Underwood2
4Underwood1
5Underwood2

Il y a toujours des produits pour trois marques de machines à écrire. Cependant, vous savez maintenant qu'il y a deux produits pour Adler et Olympia, qui apparaissent deux fois pour chaque machine à écrire. Il y a trois produits pour Underwood. En plus, vous savez de quels produits il s'agit.

Examinons cet exemple :

SELECT product_id,
	 product_name,
	 typewriter_brand,
	 COUNT(*) AS product_count
FROM typewriter_products
GROUP BY product_id, product_name, typewriter_brand
ORDER BY typewriter_brand;

Il s'agit d'une version étendue de la requête précédente. Nous regroupons à nouveau par product_id. Pour obtenir le nombre d'occurrences de produits, nous utilisons la fonction COUNT(). Nous voulons également plus d'étiquettes, nous ajoutons donc le nom du produit et la marque de la machine à écrire au SELECT.

Puisque ces colonnes apparaissent dans le SELECT, elles doivent également apparaître dans le GROUP BY. Notez que toutes les colonnes le font, à l'exception de celle qui contient la fonction aggregate.

Jetez un coup d'œil à la sortie :

product_idproduct_nametypewriter_brandproduct_count
6typewriter ribbonAdler2
7typewriter ribbonAdler2
1typewriter ribbonOlympia2
2typewriter ribbonOlympia2
3typewriter ribbonUnderwood2
4typewriter ribbonUnderwood1
5typewriter ribbonUnderwood2

Vous pouvez voir que ce résultat donne l'image la plus claire. Il y a sept produits différents, mais ce sont tous des rubans de machines à écrire. Ces produits sont destinés à trois marques de machines à écrire. Tous les produits ont deux occurrences, sauf le produit n° 4.

Regroupement par valeur

Il n'est pas toujours nécessaire de regrouper par la colonne ID. Il est également possible de regrouper les données par valeur.

Par exemple, si vous voulez savoir combien d'unités il y a en fonction de la couleur du ruban, vous pouvez utiliser cette requête :

SELECT ribbon_color,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color;

Ici, nous utilisons la couleur du ruban comme critère de regroupement. La fonction d'agrégation SUM() fera le total des unités de la manière suivante :

ribbon_colorunits_sum
Black508
Black + Red265

La sortie montre qu'il y a 508 rubans noirs et 265 rubans noirs et rouges.

Si vous n'êtes pas familier avec l'addition des valeurs, consultez l'explication de la fonction SUM(). Les fonctions MIN() et MAX() sont également couramment utilisées avec GROUP BY.

Deux colonnes pour définir le groupe

La clause GROUP BY vous permet de regrouper des données par deux colonnes ou plus ; vous l'avez déjà vu. Mais il est également possible d'utiliser deux colonnes comme identifiant unique d'un groupe. Par exemple :

SELECT ribbon_color,
	 typewriter_brand,
	 SUM(units) AS units_sum
FROM typewriter_products
GROUP BY ribbon_color, typewriter_brand
ORDER BY typewriter_brand;

Dans cette requête, nous utilisons les colonnes ribbon_color et typewriter_brand pour définir un groupe. Chaque couleur de ruban pour une machine à écrire spécifique ne sera affichée qu'une seule fois. Pour un tel groupe défini, nous calculons le nombre de rubans disponibles :

ribbon_colortypewriter_brandunits_sum
BlackAdler98
Black + RedAdler43
BlackOlympia185
Black + RedOlympia195
BlackUnderwood225
Black + RedUnderwood27

Regroupement par une expression

Au lieu de regrouper uniquement par colonnes, il est également possible de regrouper les données par une expression.

Examinons la requête suivante :

SELECT ribbon_brand,
	 ribbon_color,
	 units*price AS product_value,
 SUM(units*price) AS product_value_sum
FROM typewriter_products
GROUP BY ribbon_brand, ribbon_color, units*price
ORDER BY ribbon_brand;

Ici, nous sélectionnons la marque et la couleur du ruban. En outre, nous calculons également la valeur de chaque groupe en multipliant l'unité par le prix.

Ensuite, nous regroupons les données par les colonnes ribbon_brand et ribbon_color. C'est quelque chose dont vous avez l'habitude. Mais nous ajoutons également la formule de calcul de la valeur à la clause GROUP BY. Nous voulons afficher uniquement les valeurs uniques par marque et couleur de ruban. S'il y a plusieurs des mêmes valeurs calculées dans le même groupe, elles seront affichées comme une seule ligne.

Pour rendre l'agrégation plus évidente, j'ai ajouté la somme des valeurs des produits. Vous verrez bientôt pourquoi.

ribbon_brandribbon_colorproduct_valueproduct_value_sum
All You NeedBlack346.36346.36
All You NeedBlack880.001,760.00
All You NeedBlack + Red327.21327.21
All You NeedBlack + Red480.00960.00
Our RibbonBlack1,350.001,350.00
Ribbons & UsBlack1,201.831,201.83
Ribbons & UsBlack1,333.261,333.26
Ribbons & UsBlack4,783.794,783.79
Ribbons & UsBlack + Red398.58398.58
Ribbons & UsBlack + Red818.10818.10
Ribbons & UsBlack + Red2,227.052,227.05

On pourrait croire que ce tableau n'est pas du tout groupé. Mais regardons de plus près. Si les données n'étaient pas groupées, la marque All You Need serait apparue six fois, tout comme Ribbons & Us. Mais elle n'apparaît que quatre fois. Pourquoi ? Parce que les valeurs 880.00 et 480.00 apparaissent deux fois chacune, et sont donc regroupées.

C'est ce que la colonne product_value_sum vous indique dans les lignes colorées. Ce sont les seules lignes où cette colonne est différente de product_value. La ligne verte a une somme de 1 760,00 car la valeur 880,00 apparaît deux fois. La somme de la ligne rouge est de 960,00 car la valeur 480,00 apparaît deux fois.

Étapes de l'écriture d'une requête avec les fonctions GROUP BY et Aggregate

Vous avez déjà intériorisé GROUP BY en écrivant toutes les requêtes ci-dessus. Mais je pense que cela vaut la peine d'avoir une liste séparée - la liste de contrôle des étapes.

  • Étape 1 : Identifiez la ou les colonnes de regroupement, c'est-à-dire la ou les colonnes par lesquelles vous voulez regrouper les données. Après l'avoir identifiée, mettez-la dans la clause GROUP BY.
  • Étape 2 : en fonction de la métrique que vous souhaitez calculer, choisissez la fonction d'agrégation appropriée et utilisez-la dans l'instruction SELECT.
  • Étape 3 : utilisez la colonne de regroupement dans l'instruction SELECT. Ainsi, vous obtiendrez des étiquettes de données pour chaque groupe, et pas seulement le résultat de la fonction d'agrégation.

Aucun utilisateur de SQL ne peut éviter d'utiliser GROUP BY

Aucun utilisateur SQL connu de moi n'a réussi à mener une vie SQL réussie et à écrire des requêtes sans GROUP BY. C'est impossible ! Alors pourquoi ne pas pratiquer GROUP BY et d'autres expressions et fonctions SQL ? Le choix le plus judicieux serait notre Exercices Pratiques de SQL. Il vous offre la possibilité de pratiquer toutes les différentes façons d'utiliser GROUP BY abordées dans l'article.

D'autres ressources utiles pour des exemples de GROUP BY sont disponibles sur notre blog ; le concept apparaît également souvent dans les questions d'entretien d'embauche en SQL.