Filtrar grupos com HAVING
Depois de criar grupos com uma cláusula GROUP BY, você pode filtrar ainda mais os resultados. A cláusula HAVING funciona como um filtro nos grupos. Isso é semelhante à maneira como a cláusula WHERE atua como um filtro em linhas retornadas pela cláusula FROM.
Uma cláusula HAVING permite criar uma condição de pesquisa, conceitualmente semelhante ao predicado de uma cláusula WHERE, que testa cada grupo retornado pela cláusula GROUP BY.
O exemplo a seguir conta os pedidos de cada cliente e filtra os resultados para incluir apenas os clientes que fizeram mais de 10 pedidos:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Compare TER com ONDE
Embora as cláusulas HAVING e WHERE filtrem dados, lembre-se de que WHERE opera em linhas retornadas pela cláusula FROM. Se um GRUPO POR ... A seção HAVING existe em sua consulta seguindo uma cláusula WHERE, a cláusula WHERE filtrará linhas antes que GROUP BY seja processado — potencialmente limitando os grupos que podem ser criados.
Uma cláusula HAVING é processada após GROUP BY e opera apenas em grupos, não em linhas detalhadas. Para resumir:
- Uma cláusula WHERE filtra linhas antes de qualquer grupo ser formado
- Uma cláusula HAVING filtra grupos inteiros e geralmente analisa os resultados de uma agregação.