Agréger avec GROUP BY et HAVING
DébutantUne agrégation résume plusieurs lignes en une seule valeur par groupe.
SELECT statut,
count(*) AS nb_commandes,
sum(total) AS chiffre_affaires,
round(avg(total), 2) AS panier_moyen,
max(cree_le) AS derniere
FROM commandes
WHERE cree_le >= date '2026-01-01'
GROUP BY statut
HAVING count(*) >= 10
ORDER BY chiffre_affaires DESC;
WHERE ou HAVING ?#
WHEREfiltre les lignes avant le regroupement.HAVINGfiltre les groupes après agrégation (il peut utilisercount(*),sum(...)).
Filtrez le plus tôt possible avec WHERE : moins de lignes à regrouper.
Compter correctement#
| Expression | Compte |
|---|---|
count(*) | Toutes les lignes |
count(colonne) | Les lignes où la colonne n'est pas NULL |
count(DISTINCT colonne) | Les valeurs distinctes non nulles |
count(*) FILTER (WHERE actif) | Les lignes vérifiant une condition, dans la même requête |
Astuce :
FILTERpermet plusieurs comptages conditionnels en un seul passage :count(*) FILTER (WHERE statut = 'paye') AS payees, count(*) FILTER (WHERE statut = 'annule') AS annulees.