Aller au contenu

La clause GROUP BY

  • Un SELECT permet d'extraire des données et de spécifier les colonnes à retourner
  • La clause WHERE permet de limiter les lignes retournées dans la table
  • Les fonctions d’agrégat servent à résumer plusieurs lignes d’une table pour produire une seule valeur

La clause GROUP BY permet de regrouper des lignes qui ont la même valeur dans une ou plusieurs colonnes, afin de faire des calculs sur chaque groupe.

GROUP BY sert à répondre à des questions du type :

  • Combien d’étudiants par programme ?
  • Quelle est la moyenne des notes par cours ?
  • Combien de ventes par mois ?
  • Quel est le total des ventes par employé ?

Le SGBD va procéder à créer des sous-groupes (programme, cours, mois, employé), puis il appliquera la fonction d'agrégat pour chaque groupe.

Elle est donc presque toujours utilisée avec des fonctions d’agrégat, comme :

  • COUNT() → compter
  • SUM() → additionner
  • AVG( → moyenne
  • MIN() → valeur minimale
  • MAX() → valeur maximale

Exemple avec Count()

Selon les donnée suivantes :

noEtudiant nom programme
1 Léa Informatique
2 Marc Informatique
3 Sara Comptabilité
4 Adam Informatique

Si on écrit :

SELECT COUNT(*)
FROM Etudiant;

On obtient le résultat : 4 qui représente le nombre total d'étudiants.

Si on veut savoir **Combien d’étudiants par programme ?*, on écrit :

SELECT programme, COUNT(*) AS "Nombre d'étudiant" 
FROM Etudiant
GROUP BY programme;

Résultat :

programme Nombre d'étudiants
Informatique 3
Comptabilité 1

Explication :

  1. Le SGBD regroupe les lignes par programme.
  2. Il compte le nombre d’étudiants dans chaque groupe.
  3. Il affiche un résultat par groupe.

Exemple avec SUM()

La fonction SUM() s'utilise obligatoirement avec une colonne de données numériques.

Soit la table Commandes :

noCommande employe montant
1 Julie 100
2 Marc 200
3 Julie 150
4 Marc 50

Quel est le total des ventes par employé ?

On écrit :

SELECT employe, SUM(montant) AS "Total par employé"
FROM Commande
GROUP BY employe;

Résultat :

employe Total par employé
Julie 250
Marc 250

Regroupement sur plusieurs colonnes

Lorsqu'on demande un retour de plusieurs colonnes avec une fonction d'agrégat, on doit s'assurer d'indiquer quoi faire avec chaque colonne, sinon, on obtient une erreur.

Exemple :

Soit les données suivantes :

noEtudiant nom programme groupe
1 Léa Informatique 1
2 Marc Informatique 2
3 Sara Comptabilité 1
4 Adam Informatique 1

Et qu'on désire connaître le nombre d'étudiants par groupe dans chaque programme.

❌ La requête suivante est en erreur :

SELECT programme, groupe, COUNT(*)
FROM Etudiant
GROUP BY programme;

Car dans un programme, il peut y avoir plus d'un groupe et donc la BD ne peut retourner une seule valeur.

✔ Solution : regrouper par plusieurs colonnes.

SELECT programme, groupe, COUNT(*)
FROM Etudiant
GROUP BY programme, groupe;

Ici, SQL crée un groupe pour chaque combinaison unique possible par le GROUP BY :

  • Informatique, groupe 1
  • Informatique, groupe 2
  • Comptatbilité, groupe 1
  • etc.

Puis, compte le nombre de lignes dans chaque groupe, pour le résultat suivant :

programme groupe COUNT(*)
Informatique 1 2
Informatique 2 1
Comptabilité 1 1

Règle très importante

Quand on utilise GROUP BY :

👉 Toutes les colonnes retournées par le SELECT doivent être :

  • soit dans une fonction d’agrégat
  • soit présentes dans le GROUP BY

Ordre d'exécution

Même si on écrit :

SELECT programme, COUNT(*)
FROM Etudiant
GROUP BY programme;

SQL exécute dans cet ordre logique :

  1. FROM : lecture de la table
  2. GROUP BY : création de sous-groupes
  3. Calcul d'agrégats
  4. SELECT : Extraction des colonnes voulues pour l'affichage

Et avec une condition WHERE et un tri ORDER BY, l'ordre est :

  1. FROM : lecture de la table
  2. WHERE : filtrer les lignes
  3. GROUP BY : création de sous-groupes
  4. Calcul d'agrégats
  5. SELECT : Extraction des colonnes voulues pour l'affichage
  6. ORDER BY : tri des lignes