Leçon 5 / 15

Regrouper les résultats

8 min SQL — jointures, agrégats et sous-requêtes Gratuit

Objectif : Produire un total d’emprunts par adhérent avec un GROUP BY correct.

Un total général d’emprunts ne vous indique pas quels adhérents utilisent le plus la médiathèque. Pour produire une ligne par personne, vous devez regrouper les lignes d’emprunt selon l’adhérent auquel elles sont rattachées. Vous allez construire cette synthèse sans perdre les adhérents qui n’ont encore rien emprunté.

Passer d’une ligne par emprunt à une ligne par adhérent

Une jointure entre adherents et emprunts produit une ligne pour chaque correspondance. Si un adhérent a effectué trois emprunts, son nom apparaît donc sur trois lignes. GROUP BY rassemble ces lignes en groupes afin que vous puissiez calculer une mesure par groupe, par exemple le nombre d’emprunts par adhérent.

La granularité décrit ce que représente une ligne du résultat. Ici, la granularité voulue est « un adhérent » : chaque groupe correspond à un adhérent, et son total est calculé à partir des emprunts associés. Pour cette synthèse, vous pouvez partir de adherents et utiliser LEFT JOIN, déjà étudié dans « Conserver les lignes sans correspondance », afin de garder aussi les personnes sans emprunt.

SQL
SELECT
    a.id AS adherent_id,
    a.nom AS adherent,
    COUNT(e.adherent_id) AS nombre_emprunts
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
GROUP BY
    a.id,
    a.nom
ORDER BY
    a.nom;
Résultat attendu
Exemple de forme du résultat :

adherent_id | adherent       | nombre_emprunts
------------+----------------+----------------
1           | Amina Diallo   | 3
2           | Hugo Martin    | 0
3           | Léa Bernard    | 1

Les noms de colonnes suivent le schéma de référence : adherents.id identifie l’adhérent, adherents.nom fournit son nom et emprunts.adherent_id le rattache à ses emprunts. La jointure établit les correspondances ; le regroupement, lui, détermine combien de lignes le résultat final contient. COUNT(e.adherent_id) compte les emprunts correspondants : pour un adhérent sans emprunt, cette colonne est NULL dans la ligne conservée par le LEFT JOIN, et le compte vaut zéro.

Respecter les colonnes de regroupement

Dans une requête regroupée, les colonnes affichées doivent avoir un sens pour chaque groupe. MariaDB accepte les colonnes placées dans GROUP BY et les expressions agrégées comme COUNT(...). Ici, a.id et a.nom sont les colonnes de regroupement ; le nombre d’emprunts est calculé séparément pour chaque couple de valeurs.

SQL
-- Incorrect : a.nom n'est ni regroupé ni agrégé.
SELECT
    a.id AS adherent_id,
    a.nom AS adherent,
    COUNT(e.adherent_id) AS nombre_emprunts
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
GROUP BY
    a.id;
Résultat attendu
Avec le mode SQL strict, MariaDB refuse cette requête : la colonne a.nom n’est pas regroupée ni agrégée.

Même si un identifiant désigne une seule personne dans les données, ne comptez pas sur MariaDB pour déduire automatiquement la valeur du nom à afficher. Regroupez explicitement toutes les colonnes descriptives sélectionnées, comme dans la requête complète. Cette écriture reste claire et fonctionne avec les réglages stricts couramment utilisés.

À retenir

  • GROUP BY rassemble les lignes qui partagent les mêmes valeurs de regroupement.
  • La granularité indique ce que représente une ligne du résultat ; ici, une ligne par adhérent.
  • Les colonnes descriptives sélectionnées doivent figurer dans GROUP BY pour une requête compatible avec le mode strict de MariaDB.
  • Avec LEFT JOIN, COUNT(e.adherent_id) donne zéro pour un adhérent sans emprunt.

Dans la prochaine leçon, vous calculerez des mesures par œuvre à partir d’une chaîne de jointures.

Envie d'aller plus loin ?

Les cours Enovatic sont gratuits et le resteront. Si vous cherchez un accompagnement encadré, nos formations professionnelles sont animées par les mêmes formateurs.