</>
Plan du cours — 6/64

Agréger avec GROUP BY et HAVING

Débutant

Une 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 ?#

  • WHERE filtre les lignes avant le regroupement.
  • HAVING filtre les groupes après agrégation (il peut utiliser count(*), sum(...)).

Filtrez le plus tôt possible avec WHERE : moins de lignes à regrouper.

Compter correctement#

ExpressionCompte
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 : FILTER permet plusieurs comptages conditionnels en un seul passage : count(*) FILTER (WHERE statut = 'paye') AS payees, count(*) FILTER (WHERE statut = 'annule') AS annulees.