Regrouper et analyser les données

Calculer des indicateurs avec SQL, regrouper les commandes et interpréter les résultats sans confondre lignes, clients et valeurs manquantes.

Environ 35 minutes

  • Choisir un agrégat adapté à une question de gestion.
  • Distinguer les filtres WHERE et HAVING.
  • Interpréter un résultat regroupé et ses limites.
Sommaire
  1. Partir de la question de gestion
  2. Calculer une synthèse globale
  3. Regrouper et filtrer les groupes
  4. Compter aussi les clients sans commande
  5. Interpréter sans surconclure
  6. Au bac : justifier une exploitation de données

Quatre commandes permettent-elles de mesurer quatre clients actifs ?

La coopérative fictive Aube possède des données de commandes. La responsable veut connaître le montant enregistré, le nombre de clients concernés et ceux dont le cumul atteint un seuil. Une liste détaillée devient difficile à lire quand elle grandit. Les fonctions d’agrégation produisent des indicateurs, à condition de définir exactement ce qui est compté. Ce chapitre prolonge les requêtes de sélection et les jointures par des regroupements. Chaque résultat sera rattaché à son périmètre et à son unité.

Partir de la question de gestion

Nous utilisons CLIENT(id_client, nom, ville) et COMMANDE(id_commande, id_client, montant). Les clients sont Aube, identifiant 1, à Lyon ; Borel, identifiant 2, à Paris ; Cime, identifiant 3, à Lyon ; Dune, identifiant 4, à Lille. Les commandes sont respectivement (101, 1, 80), (102, 1, 120), (103, 2, 40) et (104, 3, 20). Les montants sont exprimés en euros. Dune n’a aucune commande dans cet extrait fictif. Toutes les valeurs du jeu principal sont renseignées.

La première question porte sur l’ensemble des commandes. La deuxième porte sur chaque client. Ce changement de niveau d’analyse change le nombre de lignes du résultat. Sans regroupement, un calcul global renvoie un indicateur sur l’ensemble retenu. Avec GROUP BY id_client, chaque valeur distincte de l’identifiant constitue un groupe. Une ligne représente alors un groupe de commandes appartenant au même client, et non une commande particulière.

Avant de calculer, on précise la population, la période, l’unité et le sens de l’indicateur. Ici, aucune date ni information sur le paiement n’est disponible. Le cumul des montants ne peut donc pas être présenté comme le chiffre d’affaires encaissé du mois. Il représente seulement les montants des quatre commandes de l’extrait. Un intitulé prudent évite de transformer un calcul exact en conclusion trompeuse.

Vocabulaire

Agrégat :
Fonction qui résume plusieurs lignes ou valeurs par un résultat, comme une somme ou un nombre.
Groupe :
Ensemble de lignes partageant les mêmes valeurs pour les attributs du regroupement.
Valeur NULL :
Marqueur indiquant une valeur absente ou inconnue ; ce n’est ni zéro ni une chaîne vide.
Granularité :
Niveau de détail représenté par une ligne, par exemple une commande ou un client.

Calculer une synthèse globale

COUNT(*) compte les lignes retenues. COUNT(montant) compte les valeurs renseignées du montant. SUM(montant) additionne les valeurs renseignées ; AVG(montant) en calcule la moyenne. MIN et MAX donnent les valeurs extrêmes renseignées. Le choix dépend de la question : un nombre de commandes n’a pas la même unité qu’un montant total. Les alias rendent les titres du résultat compréhensibles, sans changer le calcul.

Exemple résolu

Quel est le bilan des quatre commandes du jeu principal ?

  1. Étape 1 : Écrire SELECT COUNT(*) AS nb_commandes, SUM(montant) AS total, AVG(montant) AS moyenne, MIN(montant) AS minimum, MAX(montant) AS maximum FROM COMMANDE.
  2. Étape 2 : Compter les quatre lignes, puis additionner 80 + 120 + 40 + 20 = 260.
  3. Étape 3 : Diviser 260 par 4 pour vérifier la moyenne ; repérer les extrêmes dans les données.

Résultat : Le résultat comporte une ligne : nb_commandes = 4, total = 260 €, moyenne = 65 €, minimum = 20 € et maximum = 120 €. Il décrit des commandes, pas quatre clients distincts.

Piège à éviter : Une colonne appelée moyenne ne prouve pas que le dénominateur choisi correspond à la question métier.

Une donnée manquante doit rester visible dans l’interprétation. Dans une variante séparée, on ajoute une cinquième commande dont le montant est NULL. COUNT(*) vaut alors 5, COUNT(montant) vaut 4 et AVG(montant) reste 65. La moyenne porte sur les quatre montants connus. Remplacer automatiquement l’inconnu par zéro ferait baisser la moyenne à 52 et affirmerait à tort que la commande vaut zéro.

À toi d'essayer

Dans cette variante à cinq lignes, quel contrôle permet de repérer le montant manquant ?

Voir la réponse

Comparer COUNT(*) et COUNT(montant). La différence 5 − 4 = 1 révèle une ligne sans montant renseigné. Il faut rechercher la donnée ou signaler la limite, sans inventer sa valeur.

Attention :

Sur un ensemble sans valeur renseignée, COUNT retourne zéro, tandis que SUM et AVG retournent NULL dans SQLite. Un résultat absent n’est pas automatiquement un montant nul.

Regrouper et filtrer les groupes

GROUP BY id_client rassemble les commandes par identifiant. On sélectionne cet identifiant et les agrégats voulus. Une colonne détaillée, comme id_commande, ne doit pas être ajoutée arbitrairement à cette synthèse : plusieurs commandes correspondent au même groupe. Pour une requête claire et portable, les colonnes sélectionnées hors agrégats doivent correspondre au regroupement. L’ordre des groupes nécessite ORDER BY ; il n’est pas garanti par GROUP BY.

Exemple résolu

Afficher les clients dont le montant cumulé atteint 100 €.

  1. Étape 1 : Écrire SELECT id_client, COUNT(*) AS nb_commandes, SUM(montant) AS total FROM COMMANDE GROUP BY id_client HAVING SUM(montant) >= 100 ORDER BY total DESC, id_client ASC.
  2. Étape 2 : Former trois groupes : le client 1 possède les montants 80 et 120 ; le client 2 possède 40 ; le client 3 possède 20.
  3. Étape 3 : Calculer les cumuls 200, 40 et 20, puis appliquer le seuil au résultat de chaque groupe.

Résultat : Seul le groupe du client 1 est conservé : deux commandes et un cumul de 200 €. Dune est absent dès le départ, car la requête part seulement de COMMANDE.

Piège à éviter : WHERE montant >= 100 ne répondrait pas à la même question : il éliminerait la commande de 80 avant de calculer le cumul.

Le regroupement donne trois cumuls à partir de quatre commandes.

WHERE filtre des lignes avant le regroupement. HAVING filtre les groupes après le calcul des agrégats. Pour étudier uniquement les commandes d’un intervalle de dates, on placerait le critère de date dans WHERE. Pour conserver ensuite les clients dépassant un cumul, on utiliserait HAVING. Ces deux filtres peuvent coexister, car ils répondent à deux questions différentes sur deux niveaux de données.

À toi d'essayer

On remplace HAVING SUM(montant) >= 100 par WHERE montant >= 100, placé avant GROUP BY. Quel résultat obtient-on ?

Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.

Compter aussi les clients sans commande

Une jointure interne entre CLIENT et COMMANDE conserve les correspondances présentes. Pour afficher tous les clients, même ceux sans commande, on part de CLIENT et on utilise LEFT JOIN. Le client sans correspondance demeure dans le résultat, avec des attributs de commande à NULL. Cette ligne permet d’identifier son absence d’activité, mais elle n’est pas une commande réelle.

Exemple résolu

Compter les commandes de chaque client en conservant Dune.

  1. Étape 1 : Écrire SELECT c.id_client, c.nom, COUNT(o.id_commande) AS nb_commandes FROM CLIENT AS c LEFT JOIN COMMANDE AS o ON c.id_client = o.id_client GROUP BY c.id_client, c.nom ORDER BY c.id_client ASC.
  2. Étape 2 : Pour Aube, la jointure produit deux identifiants de commande renseignés ; pour Borel et Cime, elle en produit un.
  3. Étape 3 : Pour Dune, la ligne conservée comporte un identifiant de commande NULL. COUNT(o.id_commande) ne le compte pas.

Résultat : Le résultat contient quatre clients : Aube a 2 commandes, Borel 1, Cime 1 et Dune 0. L’identifiant conserve la distinction entre deux clients qui porteraient éventuellement le même nom.

Piège à éviter : COUNT(*) donnerait 1 pour Dune, car il compte la ligne conservée par la jointure externe.

Compter une clé de commande renseignée mesure les commandes réellement associées.

Une jointure peut aussi multiplier des lignes si plusieurs enregistrements correspondent à une même clé. Avant une somme, il faut vérifier le niveau de détail obtenu. Joindre chaque commande à ses lignes d’articles puis additionner le montant total de commande répéterait ce montant autant de fois qu’il y a de lignes. Le contrôle consiste à suivre une commande témoin et à compter ses apparitions après chaque jointure.

Contrôler un indicateur SQL

  1. Reformuler la demande avec une population, une unité et une granularité explicites.
  2. Identifier les tables, les clés de jointure et les éventuelles valeurs absentes.
  3. Choisir le filtre des lignes, les colonnes du regroupement et la fonction d’agrégation.
  4. Appliquer le filtre des groupes, puis fixer un ordre de présentation.
  5. Recalculer quelques cas à la main, notamment un groupe multiple et un cas sans correspondance.
  6. Présenter le résultat avec une limite liée aux données disponibles.

Interpréter sans surconclure

Une moyenne de moyennes n’est pas forcément la moyenne générale. Les clients du jeu principal ont des nombres de commandes différents. Aube a une moyenne de 100 € sur deux commandes ; Borel 40 € sur une ; Cime 20 € sur une. Donner le même poids à ces trois moyennes décrit un client moyen parmi les clients actifs, et non une commande moyenne. Le dénominateur détermine donc le sens de l’indicateur.

À toi d'essayer

Un autre service possède deux groupes : dix commandes de moyenne 30 € et deux commandes de moyenne 90 €. La moyenne générale est-elle 60 € ?

Correction détaillée pas à pasDans ce chapitre : 2 corrections détaillées.

Attention :

Ne pas confondre une variation de quantité et une variation de valeur. Un client peut avoir beaucoup de petites commandes et un cumul inférieur à celui d’un client ayant une seule grosse commande.

Pour compter les clients actifs, COUNT(DISTINCT id_client) appliqué à COMMANDE vaut 3 dans le jeu principal. COUNT(*) vaut 4. Le premier mesure des identifiants distincts de clients associés à une commande ; le second mesure des commandes. Aucun des deux ne donne le nombre total de clients enregistrés, qui vaut 4 dans CLIENT. Des nombres égaux peuvent ainsi représenter des réalités différentes.

Bilan

RepèreSens pour la gestion
COUNT(*)Nombre de lignes dans le périmètre retenu.
COUNT(colonne)Nombre de valeurs renseignées dans cette colonne.
SUM et AVGSomme et moyenne des valeurs renseignées.
GROUP BYUne synthèse pour chaque groupe défini.
WHERE puis HAVINGFiltrer les lignes puis les groupes calculés.

Au bac : justifier une exploitation de données

Dans une analyse de gestion, la réponse utile relie la demande, la requête et la décision. On nomme l’indicateur, on explique les filtres et on interprète le résultat avec son unité. Si les données ne précisent pas la période ou le paiement, on le signale. Cette démarche développe l’analyse des documents ; elle ne crée pas une épreuve écrite autonome de spécialité SIG. Pour la session 2027, l’écrit de management, sciences de gestion et numérique porte sur l’enseignement commun.

Rédiger une réponse argumentée

  1. Présenter le besoin du responsable et ce que représente chaque ligne du résultat.
  2. Justifier le regroupement et le choix entre COUNT, SUM ou AVG.
  3. Appuyer l’interprétation sur un résultat chiffré correctement nommé.
  4. Signaler une limite concrète, comme une valeur manquante ou une période non renseignée.

Pour s’entraîner davantage, poursuivre avec la rubrique Exercices. Une bonne vérification consiste à prévoir le résultat avant d’exécuter la requête, puis à expliquer tout écart constaté. Un résultat inattendu peut révéler une mauvaise jointure, un filtre placé au mauvais niveau ou une hypothèse fausse sur les données.

À retenir

  • Définir l’indicateur avant de choisir une fonction SQL.
  • COUNT(*) compte les lignes ; COUNT(colonne) ignore les valeurs NULL.
  • WHERE filtre avant le regroupement et HAVING après.
  • Une jointure peut changer le nombre de lignes et fausser une somme.
  • Toute moyenne doit être interprétée avec son dénominateur.

Fiche de révision

Pour réviser, partir d’une question

combien de commandes, combien de clients actifs ou quel montant cumulé ? Repérer ensuite la granularité de la table. Choisir un agrégat et ajouter GROUP BY seulement si la synthèse doit être détaillée par client ou autre catégorie. Contrôler les valeurs NULL, les jointures et les filtres. Avec une jointure externe, compter la clé de l’objet recherché pour obtenir zéro quand il est absent. Vérifier une moyenne en reconstituant la somme et le nombre de valeurs connues. Terminer par une phrase de gestion qui précise l’unité, la population et les limites de l’extrait.

Et maintenant ?

Tu as lu le cours. L’étape suivante tient en une action.

Relis le coursLes exercices de ce chapitre arrivent bientôt.

Prolonge l’expérience !

Continue à explorer ce chapitre à travers de nouvelles activités, des défis et des expériences interactives. Avec Premium, l’apprentissage continue !

Ici, tu débloques aussi 2 corrections détaillées.

Parent ? Suivez les progrès de votre enfant.

Tous les cours de Systèmes d’information de gestion