Contrôler la cohérence d’un rapport
Objectif : Vérifier qu’un rapport agrégé ne compte ni deux fois les emprunts ni les exemplaires.
Contrôler la cohérence d’un rapport
Un rapport peut afficher des totaux plausibles tout en comptant plusieurs fois certains emprunts. Cela arrive lorsqu’une jointure produit plusieurs lignes pour un même emprunt. Vous allez vérifier la granularité du résultat et confronter ses totaux à une requête de contrôle indépendante.
Compter les emprunts, pas seulement les lignes
Dans les leçons précédentes, vous avez vu qu’une jointure peut répéter une ligne lorsqu’une table reliée contient plusieurs correspondances. Pour contrôler un rapport d’emprunts par adhérent, comparez donc le nombre de lignes obtenu avec le nombre d’identifiants d’emprunt distincts. L’identifiant d’emprunt représente ici l’objet compté ; une répétition de cet identifiant signale que le résultat joint doit être examiné.
SELECT
a.adherent_id,
a.nom,
a.prenom,
COUNT(e.emprunt_id) AS lignes_jointes,
COUNT(DISTINCT e.emprunt_id) AS emprunts_distincts
FROM adherents AS a
LEFT JOIN emprunts AS e
ON e.adherent_id = a.adherent_id
LEFT JOIN exemplaires AS ex
ON ex.exemplaire_id = e.exemplaire_id
LEFT JOIN oeuvres AS o
ON o.oeuvre_id = ex.oeuvre_id
GROUP BY
a.adherent_id,
a.nom,
a.prenom
ORDER BY
a.nom ASC,
a.prenom ASC;adherent_id | nom | prenom | lignes_jointes | emprunts_distincts
------------+--------+--------+----------------+-------------------
1 | Martin | Lina | 3 | 3
2 | Diallo | Sami | 4 | 3Dans cet exemple, l’adhérent Sami a trois emprunts distincts, mais quatre lignes dans le résultat joint. La différence indique qu’au moins un emprunt apparaît plusieurs fois dans la chaîne de jointures ; le total fondé sur COUNT(e.emprunt_id) serait donc trop élevé. COUNT(DISTINCT e.emprunt_id) protège le décompte des emprunts, mais ne corrige pas automatiquement les autres mesures : un nombre d’exemplaires ou une somme peut lui aussi être faussé par les répétitions.
Comparer avec une requête indépendante
Une seconde vérification consiste à calculer le nombre d’emprunts directement depuis la table emprunts, sans joindre les tables qui peuvent multiplier les lignes. Cette requête donne un total de référence par adhérent. Comparez-la au rapport : les totaux doivent concorder pour les adhérents concernés, en tenant compte du fait que le rapport précédent conserve aussi ceux qui n’ont aucun emprunt.
SELECT
a.adherent_id,
a.nom,
a.prenom,
COUNT(e.emprunt_id) AS total_emprunts
FROM adherents AS a
LEFT JOIN emprunts AS e
ON e.adherent_id = a.adherent_id
GROUP BY
a.adherent_id,
a.nom,
a.prenom
ORDER BY
total_emprunts DESC,
a.nom ASC,
a.prenom ASC;adherent_id | nom | prenom | total_emprunts
------------+--------+--------+---------------
2 | Diallo | Sami | 3
1 | Martin | Lina | 3
3 | Roy | Inès | 0Cette requête est un contrôle simple du total d’emprunts, car elle ne traverse pas les tables des exemplaires et des œuvres. Si votre rapport détaillé comporte d’autres conditions, reprenez-les dans le contrôle ou comparez uniquement les lignes qui répondent aux mêmes critères. Une différence peut venir d’une jointure qui multiplie les lignes, mais aussi d’un filtre absent ou d’une condition différente : vérifiez ces deux causes avant de modifier le comptage.
Trier pour faciliter la vérification
Le tri final ne change pas les totaux, mais rend les écarts plus visibles. Vous pouvez placer d’abord la mesure décroissante pour repérer les valeurs les plus importantes, puis ajouter le nom et le prénom pour départager les lignes de même valeur. Dans une requête agrégée, référencez l’alias du résultat dans ORDER BY afin de rendre l’intention lisible.
- Comptez l’identifiant de l’entité mesurée, et non des lignes jointes susceptibles d’être répétées.
- Comparez les résultats à un calcul indépendant qui part de la table portant les données à compter.
- En cas d’écart, vérifiez les jointures et les filtres avant de conclure à une erreur de données.
- Utilisez ORDER BY pour faire ressortir les valeurs élevées et ordonner les égalités de façon stable.
Dans la prochaine leçon, vous comparerez une mesure locale à une valeur calculée globalement avec une sous-requête.