🛢️Parcours Fioul GroupéMySQL · Chapitre 05
Accueil › MySQL › Chapitre 05
Chapitre 05 / 16

Les agrégations de données

Compter, sommer, moyenner : les fonctions d'agrégation résument des ensembles de lignes. Avec GROUP BY, elles répondent aux questions « combien », « par », « en moyenne ».

1 Notion

COUNT, SUM, AVG, MIN, MAX

FonctionCalcule
COUNT(*)le nombre de lignes
SUM(col)la somme
AVG(col)la moyenne
MIN / MAX(col)le minimum / maximum
SELECT COUNT(*) AS nb_commandes,
       SUM(litres) AS volume_total,
       AVG(litres) AS volume_moyen
FROM commande WHERE campagne_id = 1;
2 Notion

Regrouper avec GROUP BY

GROUP BY forme des paquets de lignes partageant la même valeur ; l'agrégat est calculé par paquet.

SELECT campagne_id, SUM(litres) AS volume, COUNT(*) AS nb
FROM commande
GROUP BY campagne_id
ORDER BY volume DESC;
Règle d'or — toute colonne du SELECT hors fonction d'agrégation doit figurer dans le GROUP BY. MySQL 8 le vérifie (mode ONLY_FULL_GROUP_BY).
3 Notion

Filtrer les groupes : HAVING

WHERE filtre les lignes avant le regroupement ; HAVING filtre les groupes après, et peut donc porter sur un agrégat.

SELECT campagne_id, SUM(litres) AS volume
FROM commande
WHERE statut = 'CONFIRMEE'     -- filtre les lignes
GROUP BY campagne_id
HAVING volume >= 5000          -- filtre les groupes (palier atteint)
ORDER BY volume DESC;
4 Notion

Sous-totaux avec ROLLUP

WITH ROLLUP ajoute une ligne de total général (repérable par un NULL dans la colonne regroupée).

SELECT commune, SUM(litres) AS volume
FROM commande c JOIN campagne ca ON c.campagne_id = ca.id
GROUP BY commune WITH ROLLUP;
🛢️ Sur le projet Fioul Groupé

Le calcul central du projet : le volume cumulé par campagne, qui déclenche le palier de prix. C'est cette agrégation que MongoDB fait avec $group — ici en une ligne de SQL.

SELECT ca.libelle, SUM(c.litres) AS volume_total
FROM campagne ca
LEFT JOIN commande c ON c.campagne_id = ca.id
GROUP BY ca.id, ca.libelle
HAVING volume_total >= 5000;   -- campagnes ayant atteint le palier
À retenir
← Chapitre 04