Filtrer les groupes avec HAVING
Lorsque vous avez créé des groupes avec une clause GROUP BY, vous pouvez filtrer davantage les résultats. La clause HAVING agit comme un filtre sur les groupes. Cela est similaire à la façon dont la clause WHERE agit comme un filtre sur les lignes retournées par la clause FROM.
Une clause HAVING vous permet de créer une condition de recherche, conceptuellement similaire au prédicat d’une clause WHERE, qui teste ensuite chaque groupe retourné par la clause GROUP BY.
L’exemple suivant compte les commandes pour chaque client et filtre les résultats pour inclure uniquement les clients qui ont passé plus de 10 commandes :
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Comparaison de HAVING et WHERE
Bien que les clauses HAVING et WHERE filtrent les données, n’oubliez pas que WHERE fonctionne sur les lignes retournées par la clause FROM. Si une section GROUP BY ... HAVING existe dans votre requête après une clause WHERE, la clause WHERE filtrera les lignes avant le traitement du GROUP BY, ce qui peut limiter les groupes pouvant être créés.
Une clause HAVING est traitée après GROUP BY et fonctionne uniquement sur les groupes, et non sur les lignes de détail. Pour résumer :
- Une clause WHERE filtre les lignes avant que des groupes ne soient formés
- Une clause HAVING filtre des groupes entiers et examine généralement les résultats d’une agrégation.