WHERE filtre avant, HAVING filtre après
WHERE s'applique aux lignes brutes avant le regroupement, HAVING s'applique au résultat agrégé. Filtrer un SUM() dans un WHERE provoque toujours une erreur : la somme n'existe pas encore à ce stade de l'exécution.
Toute colonne non agrégée doit être groupée
Si vous sélectionnez client_nom et SUM(montant), client_nom doit apparaître dans le GROUP BY. PostgreSQL refuse la requête, MySQL en mode permissif renvoie une valeur arbitraire : c'est pire, car l'erreur devient silencieuse.
Compter correctement
COUNT(*) compte les lignes, COUNT(colonne) ignore les NULL et COUNT(DISTINCT colonne) compte les valeurs uniques. Trois résultats différents pour trois besoins métier différents.
Lisibilité
Nommez vos agrégats avec AS (SUM(montant) AS chiffre_affaires) : les exports CSV et les outils de reporting reprennent ces alias comme en-têtes de colonnes.