Filtrer les groupes avec HAVING

Effectué

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 placé plus de 10 commandes :

SELECT CustomerID,
      COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;

Comparaison de HAVING et de WHERE

Bien que les clauses HAVING et WHERE filtrent toutes deux les données, n’oubliez pas que WHERE opère sur les lignes retournées par la clause FROM. Si une section GROUP BY ... HAVING existe dans votre requête suite à une clause WHERE, la clause WHERE filtre les lignes avant le traitement de GROUP BY, ce qui peut limiter les groupes qui peuvent être créés.

Une clause HAVING est traitée après GROUP BY et ne fonctionne que sur les groupes, et non sur les lignes de détails. Pour récapituler :

  • Une clause WHERE filtre les lignes avant la formation de groupes
  • Une clause HAVING filtre des groupes entiers et examine généralement les résultats d’une agrégation.