COUNT, SUM, AVG, MIN, MAX
| Fonction | Calcule |
|---|---|
| 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;
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).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;
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
- COUNT/SUM/AVG/MIN/MAX résument un ensemble de lignes.
- GROUP BY calcule un agrégat par groupe (règle ONLY_FULL_GROUP_BY).
- WHERE filtre avant, HAVING filtre les groupes après.
- Fil rouge : SUM(litres) par campagne = le volume qui débloque le prix.