🚀 Novembre a commencé ! SQLtest.online reste gratuit grâce aux dons de personnes comme vous. Aidez-nous à atteindre l'objectif de ce mois plus tôt pour que le site fonctionne sans interruption. Soutenir maintenant →
Code SQL copié dans le presse-papiers

Regrouper les données avec GROUP BY

Leçon 4.2 · Temps de lecture: ~7 minutes · Exercices pratiques ↓

Le regroupement transforme les lignes individuelles en métriques catégorisées. GROUP BY est essentiel pour les rapports où vous avez besoin de totaux par catégorie, date ou autre dimension. Dans cette leçon, vous apprendrez la syntaxe GROUP BY, la règle centrale et des exemples pratiques sur Sakila. À la fin, vous saurez construire des requêtes analytiques avec regroupement.

Dans la leçon précédente, vous avez découvert les fonctions d'agrégation. Maintenant passons à l'étape suivante: appliquer ces fonctions à différentes catégories de données.

GROUP BY fait cela en divisant les données en groupes et en calculant les métriques pour chaque groupe séparément.

SQL GROUP BY : 16049 lignes de payment se réduisent à une ligne par staff_id avec COUNT et SUM, étapes FROM, GROUP BY, SELECT

Syntaxe de GROUP BY

Structure de base:

SELECT colonne1, FONCTION_AGG(colonne2)
FROM table
GROUP BY colonne1;

La règle centrale

Quand vous utilisez GROUP BY, chaque colonne de SELECT doit:

  • soit être dans la liste GROUP BY;
  • soit être encapsulée dans une fonction d'agrégation (SUM, COUNT, AVG, MIN, MAX).

Cette règle prévient l'ambiguïté: SQL doit savoir quelle valeur retourner quand un groupe a plusieurs lignes.

Regroupement par une seule colonne

Total des paiements par client

SELECT customer_id, SUM(amount) AS total_paye
FROM payment
GROUP BY customer_id;

Résultat: une ligne par client avec la somme de ses paiements.

Nombre de paiements par employé

SELECT staff_id, COUNT(*) AS nb_paiements
FROM payment
GROUP BY staff_id;

Résultat: pour chaque employé, le nombre de paiements traités.

Paiement moyen par date

SELECT DATE(payment_date) AS date_paiement, AVG(amount) AS paiement_moyen
FROM payment
GROUP BY DATE(payment_date);

Résultat: pour chaque date, le montant moyen des paiements.

Variante: GROUP BY avec alias

SELECT DATE(payment_date) AS date_paiement, AVG(amount) AS paiement_moyen
FROM payment
GROUP BY date_paiement;

Note: cela fonctionne en MySQL/MariaDB mais pas dans tous les SGBD. Pour la compatibilité multi-SGBD, écrivez GROUP BY DATE(payment_date) complètement.


Regroupement par plusieurs colonnes

Vous pouvez regrouper par plusieurs champs à la fois pour une analyse plus détaillée.

Total des paiements par employé et client

SELECT staff_id, customer_id, SUM(amount) AS total_paye
FROM payment
GROUP BY staff_id, customer_id;

Résultat: une ligne par paire (employé, client) avec leur total de paiements.


Exemples pratiques

Rapport de chiffre d'affaires par jour

SELECT DATE(payment_date) AS pay_date, SUM(amount) AS total_sales
FROM payment
GROUP BY DATE(payment_date)
ORDER BY pay_date;

Clients les plus actifs par nombre de locations

SELECT customer_id, COUNT(*) AS rentals_count
FROM rental
GROUP BY customer_id
ORDER BY rentals_count DESC;

Tarif moyen de location par catégorie

SELECT category_id, AVG(rental_rate) AS avg_rental_rate
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
GROUP BY category_id;

Questions fréquentes

Pourquoi ne puis-je pas sélectionner n'importe quelle colonne si j'utilise GROUP BY?

Parce que les fonctions d'agrégation (SUM, COUNT, AVG) indiquent déjà comment traiter toutes les lignes du groupe. Si une colonne n'est pas agrégée, elle doit être en GROUP BY pour que SQL sache quelle valeur choisir.

Puis-je regrouper par une expression plutôt que par une colonne?

Oui, par exemple GROUP BY DATE(payment_date) ou GROUP BY YEAR(payment_date). L'expression doit correspondre en SELECT et GROUP BY.

Que se passe-t-il si GROUP BY est vide?

C'est une erreur de syntaxe. GROUP BY doit toujours avoir au moins une colonne ou une expression.


Questions d'entretien

Qu'est-ce que GROUP BY et pourquoi en avons-nous besoin?

GROUP BY combine les lignes dont les colonnes sélectionnées ont les mêmes valeurs en un seul groupe. Vous pouvez alors appliquer des fonctions d'agrégation à chaque groupe pour obtenir des statistiques récapitulatives.

Pourquoi ne puis-je pas choisir arbitrairement une colonne avec GROUP BY?

Parce qu'un groupe peut contenir plusieurs lignes avec des valeurs différentes dans cette colonne. SQL doit savoir quelle valeur retourner, sinon le résultat est ambigu. La colonne doit donc soit être en GROUP BY, soit dans une fonction d'agrégation.

Quelle est la différence entre WHERE et HAVING?

WHERE filtre les lignes AVANT le regroupement, tandis que HAVING filtre les groupes APRÈS le regroupement. Par exemple, WHERE amount > 10 exclut les lignes avant regroupement, tandis que HAVING SUM(amount) > 100 exclut les groupes dont la somme est inférieure à 100.


Points clés de cette leçon:

  • GROUP BY divise les données en groupes et applique les agrégats à chacun.
  • Règle centrale: toutes les colonnes SELECT soit en GROUP BY soit en fonction d'agrégation.
  • Vous pouvez regrouper par une ou plusieurs colonnes simultanément.
  • Vous pouvez regrouper par des expressions, comme GROUP BY DATE(payment_date).
  • GROUP BY alimente les rapports, l'analyse et les synthèses par catégorie.

Essayez de resoudre les exercices suivants pour consolider ce que vous avez appris dans cette lecon.

  1. Compter les manchots
  2. Répartition des films par catégorie
  3. Durée moyenne de location par client
  4. Coût moyen de location par catégorie
  5. Analyser les paiements mensuels