Filtrar grupos com HAVING

Concluído

Quando você tiver criado grupos com uma cláusula GROUP BY, poderá filtrar os resultados. A cláusula HAVING atua como um filtro em grupos. Isso é semelhante à forma como a cláusula WHERE atua como um filtro em linhas retornadas pela cláusula FROM.

Uma cláusula HAVING permite que você crie um critério de pesquisa, conceitualmente semelhante ao predicado de uma cláusula WHERE, que, em seguida, 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 tenham feito mais de 10 pedidos:

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

Compare HAVING com WHERE

Embora ambas as cláusulas HAVING e WHERE filtrem dados, lembre-se de que WHERE opera em linhas retornadas pela cláusula FROM. Se existir uma seção GROUP BY... HAVING em sua consulta após uma cláusula WHERE, a cláusula WHERE filtrará as linhas antes de o GROUP BY ser processado — potencialmente limitando os grupos que podem ser criados.

Uma cláusula HAVING é processada após GROUP BY e só opera em grupos, e 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 examina os resultados de uma agregação.