Regrouper les données est un outil clé pour l'analyse et la synthèse en SQL. La clause GROUP BY permet de combiner les lignes ayant les mêmes valeurs dans des colonnes spécifiées et d'appliquer des fonctions d'agrégation à chaque groupe. Dans cette leçon, vous apprendrez à utiliser GROUP BY pour le reporting et l'analyse avec des exemples issus de la base Sakila.
SELECT colonne1, FONCTION_AGG(colonne2)
FROM table
GROUP BY colonne1;
Lors de l'utilisation de GROUP BY, chaque colonne présente dans SELECT doit :
GROUP BY ;SUM, COUNT, AVG, MIN, MAX, etc.).SELECT customer_id, SUM(amount) AS total_paye
FROM payment
GROUP BY customer_id;
Résultat : Retourne l'identifiant du client et le montant total des paiements pour chaque client.
SELECT staff_id, COUNT(*) AS nb_paiements
FROM payment
GROUP BY staff_id;
Résultat : Retourne l'identifiant de l'employé et le nombre de paiements traités par chaque employé.
SELECT DATE(payment_date) AS date_paiement, AVG(amount) AS paiement_moyen
FROM payment
GROUP BY DATE(payment_date);
Résultat : Retourne le montant moyen des paiements pour chaque date.
SELECT DATE(payment_date) AS date_paiement, AVG(amount) AS paiement_moyen
FROM payment
GROUP BY date_paiement;
Cette variante fonctionne en MySQL/MariaDB, où l'utilisation d'un alias dans GROUP BY est autorisée.
Mais ce comportement n'est pas universel dans tous les SGBD et n'est pas considéré comme du SQL standard portable.
Pour des requêtes multi-SGBD, il est plus sûr d'utiliser la forme complète GROUP BY DATE(payment_date).
Vous pouvez regrouper les données par plusieurs colonnes pour une analyse plus détaillée.
SELECT staff_id, customer_id, SUM(amount) AS total_paye
FROM payment
GROUP BY staff_id, customer_id;
Résultat : Retourne l'identifiant de l'employé, l'identifiant du client et le montant total des paiements pour chaque paire employé-client.
SELECT c.name AS categorie, SUM(p.amount) AS ventes_totales
FROM payment p
JOIN rental r ON p.rental_id = r.rental_id
JOIN inventory i ON r.inventory_id = i.inventory_id
JOIN film f ON i.film_id = f.film_id
JOIN film_category fc ON f.film_id = fc.film_id
JOIN category c ON fc.category_id = c.category_id
GROUP BY c.name;
SELECT co.country, COUNT(*) AS nb_clients
FROM customer cu
JOIN address a ON cu.address_id = a.address_id
JOIN city ci ON a.city_id = ci.city_id
JOIN country co ON ci.country_id = co.country_id
GROUP BY co.country;
La clause GROUP BY permet de regrouper les données et d'appliquer des fonctions d'agrégation à chaque groupe. C'est un outil puissant pour le reporting et l'analyse en SQL. Pratiquez GROUP BY avec des exemples de la base Sakila pour obtenir rapidement des données synthétiques et construire des requêtes analytiques.