Agrégations : GROUP BY et HAVING
Revenons à la première question : quelle catégorie de documents faut-il renforcer ? Impossible d’y répondre en une seule requête simple — il faut la décomposer.
Étape 1 — Où en sont les emprunts en cours ?
Section titled “Étape 1 — Où en sont les emprunts en cours ?”Avant de parler de popularité, il faut distinguer ce qui compte vraiment (un emprunt rendu ou en cours) de ce qui ne doit pas biaiser l’analyse.
query("SELECT statut, COUNT(*) AS nb FROM emprunts GROUP BY statut ORDER BY nb DESC") statut nb0 rendu 91 en_retard 32 en_cours 3GROUP BY regroupe les lignes qui partagent la même valeur de statut, et COUNT(*) compte les lignes de chaque groupe.
Étape 2 — La popularité par catégorie (jointure + agrégation)
Section titled “Étape 2 — La popularité par catégorie (jointure + agrégation)”Pour relier un emprunt à sa catégorie, il faut joindre emprunts et documents avant de grouper :
query(""" SELECT d.categorie, COUNT(*) AS nb_emprunts FROM emprunts e JOIN documents d ON d.id = e.document_id GROUP BY d.categorie ORDER BY nb_emprunts DESC""") categorie nb_emprunts0 bd 81 livre 32 jeu_de_societe 23 dvd 2Premier signal clair : la catégorie BD représente à elle seule plus d’emprunts que toutes les autres réunies.
Étape 3 — HAVING : filtrer après agrégation
Section titled “Étape 3 — HAVING : filtrer après agrégation”WHERE filtre les lignes avant regroupement ; HAVING filtre les groupes après agrégation. Pour ne garder que les catégories à demande réellement récurrente (plus d’un emprunt) :
query(""" SELECT d.categorie, COUNT(*) AS nb_emprunts FROM emprunts e JOIN documents d ON d.id = e.document_id GROUP BY d.categorie HAVING COUNT(*) > 1 ORDER BY nb_emprunts DESC""") categorie nb_emprunts0 bd 81 livre 32 jeu_de_societe 23 dvd 2Ici, les quatre catégories passent le filtre — mais sur un jeu de données réel avec davantage de catégories rares, HAVING élimine le bruit statistique des catégories à un seul emprunt isolé, qui ne justifient pas d’investissement.
Une sous-requête pour aller plus loin
Section titled “Une sous-requête pour aller plus loin”Une autre façon de repérer une valeur remarquable : la comparer à la moyenne, calculée par une requête imbriquée dans le WHERE :
query(""" SELECT titre, tarif_retard FROM documents WHERE tarif_retard > (SELECT AVG(tarif_retard) FROM documents) ORDER BY tarif_retard DESC""") titre tarif_retard0 Cite en Ruines 1.01 Marches de l'Ouest 1.0Les jeux de société (Cite en Ruines, Marches de l'Ouest) sont les seuls documents dont le tarif de retard dépasse la moyenne du catalogue — une information utile pour la politique tarifaire de la médiathèque, indépendamment de la question initiale.
Prochaine étape
Section titled “Prochaine étape”La catégorie BD se démarque nettement. Reste à savoir qui l’emprunte, pour répondre à la seconde question de la directrice.
👉 Jointures : profil des emprunteurs et détection des inactifs
Junior TSAFACK – 12/09/2026