Leçon 9 / 15

Contrôler la cohérence d’un rapport

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

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é.

SQL
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;
Résultat attendu
adherent_id | nom    | prenom | lignes_jointes | emprunts_distincts
------------+--------+--------+----------------+-------------------
1           | Martin | Lina   | 3              | 3
2           | Diallo | Sami   | 4              | 3

Dans 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.

SQL
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;
Résultat attendu
adherent_id | nom    | prenom | total_emprunts
------------+--------+--------+---------------
2           | Diallo | Sami   | 3
1           | Martin | Lina   | 3
3           | Roy    | Inès   | 0

Cette 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.

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.