Leçon 4 / 15

Choisir le bon agrégat

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

Objectif : Calculer le nombre d’emprunts et le nombre d’adhérents distincts sur un jeu de résultats joint.

Un rapport peut afficher des lignes correctement reliées et pourtant donner un total trompeur. Le problème apparaît lorsque vous confondez le nombre de lignes produites par une jointure avec le nombre d’emprunts ou d’adhérents réellement concernés. Vous allez choisir le comptage adapté à chaque mesure.

Vous avez déjà utilisé INNER JOIN avec ON pour relier les emprunts à leurs adhérents et à leurs exemplaires, et LEFT JOIN pour conserver les adhérents sans emprunt. Les exemples ci-dessous reprennent le schéma de la médiathèque : emprunts possède notamment id, adherent_id et exemplaire_id, tandis que adherents et exemplaires possèdent chacune une colonne id.

Compter les lignes avec COUNT(*)

COUNT(*) compte toutes les lignes du résultat transmis à l’agrégat. Dans cette requête, chaque emprunt est relié à son adhérent et à son exemplaire : les correspondances se font sur les identifiants. Si les relations respectent le schéma attendu, chaque ligne de résultat représente un emprunt.

SQL
SELECT
    COUNT(*) AS nombre_emprunts
FROM emprunts AS e
INNER JOIN adherents AS a
    ON a.id = e.adherent_id
INNER JOIN exemplaires AS ex
    ON ex.id = e.exemplaire_id;
Résultat attendu
nombre_emprunts
42

La valeur « 42 » est un exemple de résultat : le nombre réel dépend des données présentes dans votre base. Les jointures internes écartent les emprunts sans correspondance dans les tables reliées. Le résultat compte donc les lignes qui passent effectivement par ces deux jointures, et non nécessairement toutes les lignes de emprunts si des données sont incohérentes ou si certaines relations sont facultatives.

COUNT(colonne) et les valeurs NULL

COUNT(colonne) compte les lignes où cette colonne n’est pas NULL. Cette différence est importante avec une jointure externe : un adhérent sans emprunt reste dans le résultat du LEFT JOIN, mais les colonnes de emprunts sont alors NULL. Compter e.id donne zéro emprunt pour cet adhérent, alors que COUNT(*) compte la ligne conservée.

SQL
SELECT
    a.id AS adherent_id,
    COUNT(*) AS lignes_resultat,
    COUNT(e.id) AS emprunts_trouves
FROM adherents AS a
LEFT JOIN emprunts AS e
    ON e.adherent_id = a.id
GROUP BY a.id
ORDER BY a.id;
Résultat attendu
Pour un adhérent sans emprunt : lignes_resultat = 1 et emprunts_trouves = 0. Pour un adhérent ayant deux emprunts : les deux valeurs sont égales à 2.

Compter les adhérents distincts

Un adhérent qui a plusieurs emprunts apparaît plusieurs fois dans le résultat joint. Additionner ces lignes ne donne donc pas le nombre d’adhérents. Utilisez COUNT(DISTINCT a.id) pour compter chaque identifiant d’adhérent une seule fois, même s’il apparaît sur plusieurs lignes.

SQL
SELECT
    COUNT(*) AS nombre_emprunts,
    COUNT(DISTINCT e.adherent_id) AS nombre_adherents
FROM emprunts AS e
INNER JOIN adherents AS a
    ON a.id = e.adherent_id
INNER JOIN exemplaires AS ex
    ON ex.id = e.exemplaire_id;
Résultat attendu
nombre_emprunts | nombre_adherents
42               | 18
Exemple : 42 lignes d’emprunt concernent 18 adhérents distincts.

Le choix de l’agrégat dépend donc de ce que vous mesurez : lignes produites, valeurs renseignées ou entités uniques. Dans le dernier exemple, les jointures relient chaque emprunt à un adhérent et à un exemplaire ; si vous ajoutez ensuite une relation susceptible de répéter un emprunt, vérifiez à nouveau le comptage. Vous étudierez ensuite comment organiser les résultats en groupes pour produire des mesures par catégorie.

À retenir

  • COUNT(*) compte toutes les lignes du résultat.
  • COUNT(colonne) ignore les lignes où la colonne vaut NULL.
  • COUNT(DISTINCT identifiant) compte les identifiants uniques.
  • Une jointure qui répète des lignes peut fausser un comptage fondé sur COUNT(*).

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.