Filtrar grupos com HAVING
Quando você tiver criado grupos com uma cláusula GROUP BY, poderá filtrar ainda mais os resultados. A cláusula HAVING atua como um filtro em 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 que você crie 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 somente os clientes que fizeram mais de 10 pedidos:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
Comparar TER com WHERE
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 processada, 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 de detalhes. 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.