DataSuits

GROUP BY SQL : Le Guide Complet pour Débutants 2026

Blog
GROUP BY SQL : Le Guide Complet pour Débutants 2026
Emoji de visage masculin avec lunettes rondes, clin d'œil et langue tirée sur fond beige.
Emoji 3D d'un homme souriant avec une barbe noire et une coiffure en dreadlocks sur fond violet clair.
Emoji féminin avec peau brune, cheveux tressés noirs, boucles d’oreilles dorées, nez percé, clin d'œil et langue tirée.
Visage animé avec cheveux violets, sourire les yeux fermés et main montrant les doigts croisés.

Candidater à l’une de nos formations DataSuits

Remplissez ce court formulaire pour candidater à la formation de votre choix. Notre équipe pédagogique vous contactera rapidement pour échanger sur votre parcours et vous accompagner dans la suite de votre inscription.

SW
Samy Wahbi Formateur Data · Responsable parcours Data Analyst
Mis à jour le 28 juin 2026 · 12 min de lecture

Dans notre guide sur les jointures SQL, on a appris à relier deux tables pour voir, ligne par ligne, quel client a commandé quel produit. Très bien. Mais si votre patron vous demande « combien chaque client a-t-il dépensé au total ? », lister toutes les lignes une par une ne suffit plus. Il faut résumer les données. C'est exactement le travail de GROUP BY.

GROUP BY est la commande qui transforme des lignes brutes en chiffres qui parlent : des totaux, des moyennes, des comptages, groupés par catégorie. C'est ce qui distingue un tableau de données d'un vrai résultat d'analyse. Sans lui, impossible de répondre à des questions comme « quel est le produit le plus vendu » ou « quel mois a généré le plus de chiffre d'affaires ».

Je forme des Data Analysts chez DataSuits, organisme de formation Qualiopi certifié par l'Université Paris 1 Panthéon-Sorbonne, et GROUP BY est, avec les jointures, l'un des deux concepts qui font vraiment passer un débutant en mode analyste. On reprend nos tables clients et commandes, et on va apprendre à les résumer, étape par étape.

Le verdict en 2 phrases

GROUP BY regroupe les lignes d'une table qui partagent une même valeur (un client, un mois, une catégorie) pour appliquer ensuite un calcul sur chaque groupe : compter, additionner, faire une moyenne. Combiné à des fonctions comme COUNT, SUM ou AVG, et filtré avec HAVING, c'est l'outil qui transforme une liste de lignes en véritables statistiques exploitables.

★ À retenir en 5 points

  • GROUP BY regroupe les lignes ayant la même valeur dans une colonne, pour calculer un résultat par groupe.
  • Il s'utilise toujours avec une fonction d'agrégation : COUNT (compter), SUM (additionner), AVG (moyenne), MIN, MAX.
  • Pour filtrer un résultat déjà groupé, on utilise HAVING, jamais WHERE (qui filtre avant le regroupement).
  • Chaque colonne du SELECT non agrégée doit obligatoirement apparaître dans le GROUP BY, sinon SQL renvoie une erreur.
  • GROUP BY est au cœur de la formation Data Analyst & IA de DataSuits.
5Fonctions d'agrégation essentiellesCOUNT, SUM, AVG, MIN, MAX
1Règle d'or à retenirHAVING après, WHERE avant
2Concepts qui font le Data AnalystJointures + GROUP BY
5,0/5Note Google DataSuits110 avis vérifiés

Le concept

GROUP BY, c'est quoi et pourquoi c'est essentiel ?

Reprenons notre exemple. Après une jointure, on obtient une ligne par commande : Camille-Clavier, Camille-Souris, Yanis-Écran. C'est précis, mais ça ne répond pas directement à « combien de commandes Camille a-t-elle passées ? ». Pour le savoir, il faut regrouper toutes les lignes de Camille ensemble, puis les compter.

C'est exactement ce que fait GROUP BY : il prend une colonne (ici, le nom du client), rassemble toutes les lignes qui ont la même valeur dans cette colonne, et forme des paquets. Un paquet pour Camille, un paquet pour Yanis, un paquet pour Inès. Ensuite, on applique un calcul sur chaque paquet : les compter, les additionner, en faire la moyenne.

L'image que je donne en cours : imaginez une pile de tickets de caisse éparpillés sur une table. GROUP BY, c'est trier ces tickets en petits tas, un tas par client. Une fois les tas formés, vous pouvez répondre à n'importe quelle question sur chaque tas : combien de tickets dans ce tas, quel est le total de ce tas, quel est le ticket le plus élevé. C'est ce passage du détail à la synthèse qui fait tout l'intérêt de GROUP BY.

✅ Le bon réflexe : dès que votre question contient les mots « par », « pour chaque » ou « combien de » (« le total des ventes par client », « le nombre de commandes pour chaque produit »), c'est le signal qu'il vous faut un GROUP BY. Apprenez à repérer ce mot « par », il trahit presque toujours un besoin de regroupement.

La boîte à outils

Les 5 fonctions d'agrégation à connaître

GROUP BY ne travaille jamais seul : il a besoin d'une fonction d'agrégation pour dire quoi calculer sur chaque groupe. Il en existe cinq, et elles couvrent presque tous les besoins d'un Data Analyst. Voici la liste, avec ce que chacune fait concrètement.

COUNT()

Compte le nombre de lignes dans chaque groupe. « Combien de commandes par client ? »

SUM()

Additionne les valeurs d'une colonne numérique. « Le total dépensé par client ? »

AVG()

Calcule la moyenne d'une colonne numérique. « Le panier moyen par client ? »

MIN()

Trouve la plus petite valeur du groupe. « La commande la moins chère de chaque client ? »

MAX()

Trouve la plus grande valeur du groupe. « La commande la plus chère de chaque client ? »

Retenez cette logique simple : COUNT répond à « combien », SUM à « quel total », AVG à « en moyenne », et MIN/MAX aux extrêmes. Une fois ces cinq verbes en tête, vous savez déjà formuler 80 % des requêtes d'analyse dont vous aurez besoin en entreprise.


En pratique

Compter et additionner par groupe

Passons à la pratique. On enrichit un peu notre table commandes avec un prix, pour pouvoir calculer des totaux :

Table : commandes (enrichie)
id
client_id
produit
prix
101
1
Clavier
45
102
1
Souris
20
103
2
Écran
180
104
2
Clavier
45

Première question : combien de commandes chaque client a-t-il passées ? On regroupe par client_id, et on compte les lignes de chaque groupe avec COUNT :

SQL — Compter par groupe
SELECT client_id, COUNT(*) AS nb_commandes
FROM commandes
GROUP BY client_id;
Résultat
client_id
nb_commandes
1
2
2
2

SQL a formé deux paquets (client 1 et client 2) et a compté les lignes de chacun. Deuxième question, un peu plus utile pour le business : combien chaque client a-t-il dépensé au total ? On remplace juste COUNT par SUM sur la colonne prix :

SQL — Additionner par groupe
SELECT client_id, SUM(prix) AS total_depense
FROM commandes
GROUP BY client_id;
Résultat
client_id
total_depense
1
65
2
225

Le client 1 (45 + 20) a dépensé 65, le client 2 (180 + 45) a dépensé 225. En combinant cette requête avec une jointure sur la table clients, vous obtenez directement le total dépensé par nom de client, prêt à présenter dans un rapport. C'est exactement le genre de requête qu'on écrit tous les jours en entreprise.

💡 Le combo gagnant : jointure + GROUP BY, c'est la paire la plus puissante du SQL. La jointure rassemble les informations dispersées entre plusieurs tables, GROUP BY les résume en indicateurs. À elles deux, elles répondent à la quasi-totalité des questions business qu'on pose à un Data Analyst.

Filtrer les groupes

Filtrer un résultat groupé avec HAVING

Imaginons qu'on ne veuille voir que les clients ayant dépensé plus de 100. Le réflexe naturel serait d'ajouter un WHERE. Mauvaise idée : WHERE ne peut pas filtrer sur un résultat de SUM ou COUNT, parce qu'il agit avant que les groupes soient formés. C'est là qu'intervient HAVING, le filtre qui s'applique après le regroupement.

SQL — HAVING après le GROUP BY
SELECT client_id, SUM(prix) AS total_depense
FROM commandes
GROUP BY client_id
HAVING SUM(prix) > 100;
Résultat
client_id
total_depense
2
225

Le client 1, avec ses 65 de total, a été écarté par le HAVING. C'est la règle la plus importante à retenir sur ce sujet : WHERE filtre les lignes avant le regroupement (par exemple, ne garder que les commandes de 2026), tandis que HAVING filtre les groupes après le calcul (par exemple, ne garder que les clients ayant dépensé plus de 100). Les deux peuvent même cohabiter dans la même requête, chacun à sa place.

✅ Le moyen mnémotechnique : WHERE trie les tickets avant de faire les tas (une ligne à la fois). HAVING trie les tas une fois qu'ils sont formés (un groupe à la fois). Si votre condition porte sur une fonction comme SUM(), COUNT() ou AVG(), c'est HAVING à coup sûr.

La structure

L'ordre des clauses SQL (à ne jamais oublier)

Une requête avec GROUP BY et HAVING doit respecter un ordre précis. Le non-respecter est l'une des erreurs les plus fréquentes chez les débutants, alors autant le graver dans le marbre dès maintenant.

SQL — L'ordre correct des clauses
SELECT   -- colonnes à afficher
FROM     -- table de départ
JOIN     -- jointures éventuelles
WHERE    -- filtre AVANT regroupement
GROUP BY -- formation des groupes
HAVING   -- filtre APRÈS regroupement
ORDER BY -- tri du résultat final

Ce n'est pas juste une question d'esthétique : SQL exécute réellement les clauses dans cet ordre logique (même si on les écrit toujours dans cet ordre à l'écriture aussi, ce qui simplifie les choses). D'abord on part d'une table, on filtre les lignes brutes, on forme les groupes, on filtre les groupes, puis on trie le résultat final. Gardez ce schéma affiché près de votre écran le temps de l'intégrer.


Les pièges

Les erreurs de débutant à éviter

Trois erreurs reviennent sans cesse chez ceux qui découvrent GROUP BY. Les connaître à l'avance vous épargnera des messages d'erreur frustrants.

1. Une colonne du SELECT absente du GROUP BY

Si vous sélectionnez une colonne qui n'est ni agrégée, ni présente dans le GROUP BY, SQL renvoie une erreur (ou, sur certains systèmes plus permissifs, un résultat imprévisible). La règle est stricte : chaque colonne « brute » du SELECT doit apparaître dans le GROUP BY. Si vous affichez client_id et produit, les deux doivent figurer dans le GROUP BY, sinon SQL ne sait pas quelle valeur afficher pour la colonne non groupée.

2. Confondre WHERE et HAVING

On l'a vu plus haut, mais ça mérite d'être répété : utiliser WHERE avec une fonction d'agrégation (WHERE SUM(prix) > 100) provoque une erreur. Le réflexe à graver : condition sur une colonne brute → WHERE. Condition sur un résultat calculé (SUM, COUNT, AVG) → HAVING.

3. Oublier que COUNT(*) et COUNT(colonne) ne sont pas identiques

COUNT(*) compte toutes les lignes du groupe, NULL compris. COUNT(colonne) ne compte que les lignes où cette colonne n'est pas NULL. Si un client a un email manquant, COUNT(email) ne le comptera pas, mais COUNT(*) si. Cette nuance change parfois complètement un résultat, alors choisissez consciemment laquelle utiliser.

📚 Apprenez le SQL et la data de A à Z

Jointures, GROUP BY, sous-requêtes : notre formation Data Analyst & IA vous forme au SQL, à Python, Power BI et l'IA sur des données réelles d'entreprise. Certificat de l'Université Paris 1 Panthéon-Sorbonne, mentors disponibles 7j/7.


La suite

S'entraîner et aller plus loin

GROUP BY se maîtrise vraiment en pratiquant sur des cas concrets. Voici comment progresser efficacement à partir d'ici.

Reprenez nos tables et variez les questions

Utilisez la table commandes enrichie de cet article et posez-vous des questions variées : le panier moyen par client (AVG), le produit le plus cher jamais commandé (MAX), le nombre de clients uniques (COUNT avec DISTINCT). Chaque question vous fait manipuler une fonction différente, et c'est cette variété qui ancre la compréhension.

Combinez GROUP BY avec les jointures

La vraie puissance apparaît quand vous joignez clients et commandes, puis groupez par nom de client pour obtenir des rapports lisibles humainement (plutôt que par identifiant numérique). Si les jointures ne sont pas encore parfaitement claires pour vous, reprenez notre guide complet sur les jointures SQL avant d'aller plus loin.

Faites-en une vraie compétence métier

GROUP BY et les jointures forment le duo fondateur du SQL analytique. Une fois ces deux piliers acquis, vous pouvez répondre à la majorité des questions business d'une entreprise. Pour transformer ces bases en un vrai métier, notre formation Data Analyst & IA vous forme au SQL, à Python, Power BI et l'IA, sur des projets réels, avec un certificat de l'Université Paris 1 Panthéon-Sorbonne, des mentors 7j/7 et un accompagnement carrière. Pour réviser les fondations SQL, notre formation SQL et notre blog restent disponibles.

🎯 Devenez Data Analyst en 2026

En 20 minutes avec un conseiller, vous validez si le métier de Data Analyst vous correspond, vous calculez votre financement (CPF, France Travail, OPCO) et vous repartez avec un plan clair. Service gratuit, sans engagement.


Questions fréquentes

GROUP BY est une clause SQL qui regroupe les lignes d'une table partageant la même valeur dans une colonne (un client, un mois, une catégorie), pour appliquer ensuite un calcul sur chaque groupe. Combiné à des fonctions comme COUNT, SUM ou AVG, il permet de transformer une liste de lignes détaillées en statistiques résumées : le total des ventes par client, le nombre de commandes par mois. C'est l'un des outils les plus utilisés en analyse de données.
WHERE filtre les lignes avant que les groupes soient formés : il agit sur les données brutes, ligne par ligne (par exemple, ne garder que les commandes de 2026). HAVING filtre les groupes après le calcul du GROUP BY : il agit sur un résultat agrégé (par exemple, ne garder que les clients ayant dépensé plus de 100 €). Règle simple : une condition sur une colonne brute va dans WHERE ; une condition sur SUM(), COUNT() ou AVG() va dans HAVING.
Les cinq fonctions d'agrégation essentielles sont : COUNT() pour compter le nombre de lignes d'un groupe, SUM() pour additionner les valeurs d'une colonne numérique, AVG() pour calculer une moyenne, MIN() pour trouver la plus petite valeur et MAX() pour trouver la plus grande. Elles s'utilisent presque toujours avec GROUP BY pour obtenir un résultat par catégorie plutôt qu'un seul chiffre global sur toute la table.
L'erreur la plus fréquente vient d'une colonne du SELECT qui n'est ni agrégée ni présente dans le GROUP BY. La règle SQL est stricte : toute colonne affichée dans le SELECT doit soit être dans une fonction d'agrégation (SUM, COUNT...), soit figurer explicitement dans le GROUP BY. Si vous sélectionnez client_id et produit, les deux doivent apparaître dans le GROUP BY, sinon SQL ne sait pas quelle valeur afficher pour la colonne non groupée à l'intérieur d'un groupe qui contient plusieurs valeurs différentes.
COUNT(*) compte toutes les lignes d'un groupe, y compris celles qui contiennent des valeurs NULL. COUNT(colonne) ne compte que les lignes où cette colonne précise n'est pas NULL (pas vide). Si vous comptez COUNT(email) et que certains clients n'ont pas renseigné d'email, ils ne seront pas comptés. Cette différence est subtile mais peut fausser une analyse si vous ne l'avez pas en tête. En général, COUNT(*) est utilisé pour un simple nombre de lignes.
Techniquement oui, mais cela revient simplement à afficher les valeurs distinctes d'une colonne, sans intérêt statistique particulier (l'équivalent d'un SELECT DISTINCT). L'intérêt réel de GROUP BY apparaît quand on l'associe à au moins une fonction d'agrégation (COUNT, SUM, AVG, MIN, MAX), pour calculer quelque chose sur chaque groupe plutôt que de simplement lister les catégories existantes. Sans fonction d'agrégation, préférez DISTINCT, plus adapté et plus lisible pour cet usage.
Oui, tout à fait. Écrire GROUP BY client_id, produit crée un groupe pour chaque combinaison unique de client et de produit, plutôt qu'un groupe par client seul. C'est très utile pour des analyses plus fines : par exemple, « combien de fois chaque client a-t-il acheté chaque produit ? ». Plus vous ajoutez de colonnes au GROUP BY, plus les groupes deviennent précis (et nombreux). C'est une extension naturelle une fois le principe à une seule colonne bien compris.
Non, et c'est même la suite logique. Si vous avez compris les jointures SQL, GROUP BY est plus simple à assimiler : il ne s'agit plus de relier des tables, mais de résumer des lignes déjà réunies. La difficulté vient surtout de la logique WHERE avant / HAVING après, qui se retient vite avec quelques exercices pratiques. En pratiquant sur des exemples concrets comme ceux de cet article, la notion se fixe généralement en une ou deux séances.
L'ordre correct est : SELECT, FROM, JOIN (si besoin), WHERE, GROUP BY, HAVING, puis ORDER BY. Cet ordre suit la logique d'exécution : on part d'une table, on filtre les lignes brutes, on forme les groupes, on filtre les groupes, puis on trie le résultat final. Respecter cet ordre à l'écriture évite la plupart des erreurs de syntaxe pour les débutants.
Après les bases (SELECT, WHERE, ORDER BY), les jointures et GROUP BY forment le duo de compétences qui fait vraiment passer un débutant en mode analyste. La formation Data Analyst & IA de DataSuits (2 990 € TTC) vous forme au SQL, à Python, Power BI et l'IA sur des données réelles, avec un certificat de l'Université Paris 1 Panthéon-Sorbonne. Elle est éligible CPF, France Travail et OPCO, avec mentors 7j/7. La note Google de DataSuits est de 5,0/5 sur 110 avis vérifiés.
SW
À propos de l'auteur
Samy Wahbi
Formateur Data · Responsable parcours Data Analyst

Formateur Data et responsable du parcours Data Analyst chez DataSuits, j'enseigne le SQL, Python et Power BI au quotidien. GROUP BY et les jointures sont les deux notions que j'explique le plus souvent : une fois maîtrisées, elles couvrent l'essentiel des besoins d'analyse en entreprise. Mon approche : toujours repartir d'un exemple concret avant la théorie.

Conclusion : de la ligne brute à l'indicateur qui compte

GROUP BY transforme une liste de lignes en véritables statistiques : il suffit de choisir une colonne pour former les groupes, puis une fonction (COUNT, SUM, AVG, MIN, MAX) pour calculer sur chacun d'eux. Ajoutez HAVING pour filtrer les groupes selon leur résultat, et vous tenez l'un des outils les plus utilisés du quotidien d'un Data Analyst.

Avec les jointures d'un côté et GROUP BY de l'autre, vous possédez désormais les deux piliers qui permettent de répondre à la grande majorité des questions business : relier l'information dispersée, puis la résumer en chiffres exploitables. Il ne reste plus qu'à pratiquer, encore et encore, sur des cas réels.

Pour transformer ces bases en métier, notre formation Data Analyst & IA à 2 990 € avec certificat de l'Université Paris 1 Panthéon-Sorbonne vous forme au SQL, à Python, Power BI et l'IA sur des données réelles. Prochaine étape : prenez rendez-vous avec un conseiller. 20 minutes pour bâtir votre projet. Service gratuit, sans engagement.

Financez votre formation en toute simplicité

Le financement ne doit jamais être un frein à votre projet.
Chez DataSuits, nos conseillers pédagogiques vous accompagnent à chaque étape pour trouver la meilleure solution de financement adaptée à votre profil:

logo-mon-compte-professionnel-de-formationFrance-travail-2023.svgopco-1

Candidater à l’une de nos formations DataSuits

Remplissez ce court formulaire pour candidater à la formation de votre choix.
Notre équipe pédagogique vous contactera rapidement pour échanger sur votre parcours et vous accompagner dans la suite de votre inscription.

Logo_datasuits

Votre demande a bien été prise en compte. 📚

Prochaine étape 👇
Réservez un échange téléphonique avec un conseiller pour parler de votre projet de formation
Contacter un conseiller
Oups ! Une erreur est survenue lors de l’envoi du formulaire.