Produire un rapport de retards
Objectif : Lister les adhérents ayant au moins un emprunt en retard, avec un total de retards par adhérent.
Un rapport de retards devient trompeur si vous comptez des emprunts qui ne sont pas encore échus, ou si vous rassemblez les résultats sans distinguer correctement les adhérents. Vous allez construire une requête qui ne retient que les emprunts non rendus dont la date d’échéance est dépassée, puis affiche un total par adhérent.
Définir ce qui compte comme retard
Pour ce rapport, un retard correspond à un emprunt dont la date de retour est encore NULL et dont la date d’échéance est antérieure à la date du jour. Cette définition exclut les emprunts déjà rendus, même si leur échéance est passée, ainsi que ceux qui doivent être rendus aujourd’hui ou plus tard. La requête utilise CURDATE(), fonction MariaDB qui fournit la date courante sans composante horaire.
Relier les emprunts à leurs adhérents
Comme dans la leçon sur les jointures internes ciblées, vous reliez les tables par leurs clés correspondantes. Les emprunts sans adhérent correspondant ne peuvent pas fournir le nom demandé ; une jointure interne les exclut du résultat. Le filtre de retard porte sur les lignes d’emprunt, avant que leurs adhérents soient regroupés.
SELECT
a.adherent_id,
a.nom,
a.prenom,
COUNT(e.emprunt_id) AS nombre_retards
FROM adherents AS a
INNER JOIN emprunts AS e
ON e.adherent_id = a.adherent_id
WHERE e.date_retour IS NULL
AND e.date_echeance < CURDATE()
GROUP BY
a.adherent_id,
a.nom,
a.prenom
HAVING COUNT(e.emprunt_id) >= 1;Le résultat comporte une ligne par adhérent en retard. Les colonnes descriptives précèdent la mesure, et l’alias nombre_retards donne un nom explicite au compte affiché. Le regroupement inclut l’identifiant ainsi que le nom et le prénom : deux adhérents portant le même nom restent ainsi des groupes distincts, et toutes les colonnes descriptives sélectionnées sont indiquées dans GROUP BY.
La condition sur les dates se trouve dans WHERE, car elle sélectionne des emprunts individuels avant le regroupement. Le HAVING conserve les groupes dont le compte vaut au moins un ; avec les conditions actuelles, chaque groupe restant satisfait déjà ce seuil. Il rend toutefois explicite l’objectif du rapport : ne présenter que des adhérents ayant au moins un retard.
Interpréter et adapter le rapport
Si un adhérent possède trois emprunts non rendus dont l’échéance est passée, il apparaît une fois et nombre_retards vaut 3. Un adhérent sans retard n’apparaît pas, car aucune de ses lignes d’emprunt ne passe le filtre. Les alias de table et la qualification des colonnes suivent les conventions déjà vues ; ici, les noms de colonnes supposent un identifiant d’emprunt emprunt_id, un identifiant d’adhérent adherent_id, ainsi que les champs de nom indiqués dans la requête.
À retenir
- Définissez le retard avec une échéance dépassée et un retour encore NULL.
- Filtrez les emprunts dans WHERE avant de calculer les totaux.
- Regroupez sur l’identifiant et les colonnes descriptives pour obtenir une ligne par adhérent.
- Utilisez un alias explicite, comme nombre_retards, pour rendre la mesure lisible.
Dans la prochaine leçon, vous contrôlerez la cohérence de résultats agrégés en comparant les comptes produits par des requêtes différentes.