Déclarer le périmètre d'un calcul
Deux requêtes justes donnent deux résultats différents parce qu'elles ne comptent pas les mêmes lignes. Avant de comparer les nombres, écris la population de chaque calcul : les objets retenus et les règles qui les incluent.
Tu prépares un inventaire des fiches produit d'Olist. « Combien de produits ont
des photos ? » peut désigner les produits dont le nombre de photos est renseigné,
ceux qui en déclarent au moins une, ou ceux qui en déclarent au moins trois.
Ces périmètres peuvent donner des comptes différents. Le champ
product_photos_qty indique un nombre déclaré dans l'export ; il ne permet pas
de vérifier que les images sont encore accessibles ni qu'elles sont de qualité.
Écrire ce que tu comptes
Dans products, une ligne représente un produit, identifié par product_id.
Avant le SQL, complète ces quatre lignes pour le périmètre « au moins une photo » :
Population : produits qui…
Objet compté : …
Mesure : …
Période ou état des données : …Comparer la définition à la requête attendue
Population : produits dont le nombre de photos déclaré est supérieur ou égal à 1.
Objet compté : un produit distinct identifié par product_id.
Mesure : nombre de produits retenus.
État des données : contenu de l'export fourni, sans filtre de période.
Le filtre doit traduire « supérieur ou égal à 1 ». La table products ne porte
pas de date de création du produit : n'annonce pas un inventaire « des produits
créés cette année » à partir de ce seul calcul.
Contrôler les filtres cumulés
Pars de tous les produits, conserve ceux dont le nombre de photos est renseigné, puis ceux qui en déclarent au moins une. Avant d'exécuter, prédis si chaque compte peut augmenter, diminuer ou rester identique.
SELECT COUNT(*) AS produits_total,
COUNT(*) FILTER (WHERE product_photos_qty IS NOT NULL) AS photos_renseignees,
COUNT(*) FILTER (WHERE product_photos_qty >= 1) AS au_moins_une_photo
FROM products;Chaque colonne compte une population ; l'unique ligne de sortie résume la table.
La troisième condition exclut déjà les valeurs non renseignées : les trois
populations sont bien emboîtées. On doit retrouver
produits_total >= photos_renseignees >= au_moins_une_photo.
Contrôler les étapes
Les comptes sont 32 951, 32 341, puis 32 341. Le premier filtre retire 610 produits dont le nombre de photos n'est pas renseigné. Le suivant ne retire rien sur ces données : tous les nombres renseignés sont au moins égaux à 1.
Deux définitions différentes peuvent donc produire le même nombre aujourd'hui. Cela ne les rend pas interchangeables pour un autre export. Un filtre ajouté à la même requête peut conserver l'effectif ; il ne peut pas l'augmenter.
Modifier le périmètre et expliquer l'écart
Écris maintenant la définition « produits déclarant au moins trois photos ».
Construis une requête sur products avec un COUNT(*) et le filtre qui correspond
à cette phrase. Avant de l'exécuter, prédis sa position par rapport aux trois
comptes précédents.
Vérifier le nouveau périmètre
Le filtre est product_photos_qty >= 3. Tu dois compter 9 589 produits.
L'écart avec « au moins une photo » est 22 752 produits ; ils déclarent une
ou deux photos. Tu peux contrôler cet écart avec un filtre BETWEEN 1 AND 2.
La différence vient du seuil retenu, pas d'une disparition de produits dans la
source. Aucun de ces seuils n'est présenté comme une exigence métier : il faut
choisir celui qui répond à la demande réelle.
Distinguer les lignes jointes des produits
Le besoin change : repérer les produits ayant une ligne d'article dans les
commandes, toujours parmi ceux déclarant au moins une photo. Une même fiche
produit peut être référencée par plusieurs lignes de order_items.
Avant d'exécuter, prédis si les deux comptes suivants doivent être égaux :
SELECT COUNT(*) AS lignes_article,
COUNT(DISTINCT p.product_id) AS produits_distincts
FROM products AS p
JOIN order_items AS i ON i.product_id = p.product_id
WHERE p.product_photos_qty >= 1;Contrôler l'objet compté après la jointure
La sortie donne 111 047 lignes d'article, mais 32 341 produits distincts.
Après la jointureRapprocher deux tables sur une colonne commune, pour lire ensemble des informations qui sont stockées séparément., une ligne correspond à une ligne d'article, et non plus à un
produit unique. COUNT(DISTINCT p.product_id) répond au comptage des produits.
Ici, le compte de produits reste égal au périmètre précédent : tous les produits retenus ont au moins une ligne d'article. Ce n'est pas une propriété garantie par une jointure interne. Sur une autre source, les produits sans ligne d'article seraient exclus. Sans filtre sur les commandes, ce calcul ne signifie pas non plus « produits livrés » ou « produits vendus cette année ».
Réécris ta définition en ajoutant cette condition d'existence d'une ligne associée. Si ta phrase décrit des produits mais ton calcul compte des lignes d'article, corrige l'un des deux avant de commenter le résultat.
Transfert autonome
Choisis une mesure de ton projet et produis deux périmètres défendables. Pour chacun, rends la définition, la requête, le résultat et une phrase qui explique la décision à laquelle il répond. Une autre personne doit pouvoir montrer la ligne SQL responsable de chaque différence entre les résultats.
Avant de partager, contrôle trois points : l'objet annoncé est celui compté, les exclusions sont explicites, et la période annoncée est portée par une date réellement disponible. Si les deux périmètres sont emboîtés, vérifie aussi l'ordre de leurs effectifs ; sinon, ne leur impose pas ce contrôle.