Comparer des groupes de résultats
Objectif : Calculer un indicateur par adhérent ou par œuvre et ne conserver que les groupes répondant à un seuil.
Un indicateur calculé sur toute une table ne répond pas toujours à une question opérationnelle. Vous pouvez, par exemple, vouloir repérer les adhérents qui ont plusieurs emprunts ou les œuvres dont la médiathèque possède plusieurs exemplaires. Pour répondre à ce type de demande, vous calculez l’indicateur séparément pour chaque groupe, puis vous écartez les groupes qui ne franchissent pas le seuil demandé.
Les fonctions d’agrégat COUNT, SUM, AVG, MIN et MAX ont été présentées dans la leçon précédente. Ici, vous les appliquez à des groupes de lignes au lieu de produire une seule valeur pour toute la table. Le schéma reste celui de la médiathèque : consultez les noms de colonnes et les liens entre tables déjà étudiés si vous avez besoin de les retrouver.
Regrouper les emprunts par adhérent
GROUP BY rassemble les lignes qui ont les mêmes valeurs pour les colonnes indiquées. La fonction d’agrégat calcule ensuite une valeur pour chaque groupe. Dans l’exemple suivant, un groupe correspond à un adhérent et le résultat indique combien d’emprunts lui sont associés.
-- Compter les emprunts de chaque adhérent
SELECT
a.id_adherent,
a.nom,
a.prenom,
COUNT(e.id_emprunt) AS nombre_emprunts
FROM adherents AS a
INNER JOIN emprunts AS e
ON e.id_adherent = a.id_adherent
GROUP BY
a.id_adherent,
a.nom,
a.prenom;La jointure permet d’afficher le nom et le prénom avec le compte d’emprunts calculé depuis emprunts. Chaque colonne affichée qui n’est pas agrégée figure dans la liste de regroupement. Inclure l’identifiant de l’adhérent est important : deux personnes peuvent avoir le même nom et le même prénom, mais leurs identifiants distinguent leurs groupes.
Appliquer un seuil aux groupes
Pour ne conserver que les adhérents ayant au moins deux emprunts, ajoutez HAVING après GROUP BY. Cette clause filtre les groupes à partir de leur indicateur agrégé. À la différence de WHERE, qui sélectionne des lignes avant le calcul des groupes, HAVING permet de poser une condition sur le compte obtenu.
-- Repérer les adhérents ayant au moins deux emprunts
SELECT
a.id_adherent,
a.nom,
a.prenom,
COUNT(e.id_emprunt) AS nombre_emprunts
FROM adherents AS a
INNER JOIN emprunts AS e
ON e.id_adherent = a.id_adherent
GROUP BY
a.id_adherent,
a.nom,
a.prenom
HAVING COUNT(e.id_emprunt) >= 2;Calculer un indicateur par œuvre
Vous pouvez appliquer le même principe à des données liées. Pour connaître les œuvres possédant au moins deux exemplaires, reliez oeuvres à exemplaires, regroupez les lignes par œuvre et comptez les identifiants d’exemplaire. Le seuil porte sur chaque œuvre, et non sur le nombre total d’exemplaires de la médiathèque.
-- Lister les œuvres possédant au moins deux exemplaires
SELECT
o.id_oeuvre,
o.titre,
COUNT(ex.id_exemplaire) AS nombre_exemplaires
FROM oeuvres AS o
INNER JOIN exemplaires AS ex
ON ex.id_oeuvre = o.id_oeuvre
GROUP BY
o.id_oeuvre,
o.titre
HAVING COUNT(ex.id_exemplaire) >= 2;Les résultats contiennent une ligne par œuvre qui franchit le seuil, avec son titre et le nombre d’exemplaires comptés. Le nombre exact de lignes dépend du contenu de la base ; si aucune œuvre ne possède deux exemplaires, cette requête ne renvoie aucune ligne. Ici, la jointure interne retient les œuvres qui ont au moins un exemplaire ; les œuvres sans exemplaire ne constituent donc pas un groupe dans ce résultat.
Ajouter les requêtes au projet
Ajoutez les exemples de cette leçon à la suite des requêtes déjà présentes dans requetes.sql. Les commentaires décrivent la question traitée, tandis que les alias tels que nombre_emprunts rendent les colonnes calculées plus lisibles. Vous pouvez modifier les seuils, par exemple remplacer >= 2 par >= 5, pour répondre à une autre demande, sans changer la logique de regroupement.
À retenir
- GROUP BY forme un groupe pour chaque combinaison des colonnes indiquées.
- Les colonnes affichées sans fonction d’agrégat doivent être incluses dans le regroupement.
- HAVING filtre les groupes selon un indicateur agrégé et un seuil.
- Utilisez WHERE pour filtrer les lignes avant le regroupement et HAVING pour filtrer les groupes après le calcul.
Dans la prochaine leçon, vous vous entraînerez à transformer une demande métier en résultat attendu, avant de choisir les données et les regroupements nécessaires.