SQL HAVING – Dica de uso

Como filtrar resultados de agregação sem exibir a coluna calculada

Olá. Hoje quero dar uma dica de utilização de funções de agregação do SQL que serve tanto para Microsoft SQL Server (MSSQL) como para Oracle.

Consiste em usar a cláusula HAVING para filtrar os resultados de uma função de agregação como COUNT, MAX, SUM, AVG etc. sem precisar exibir o resultado deste cálculo.

Convencionalmente as funções são usadas para mostrar resultados de cálculos sobre colunas do banco. Assim elas são uma ferramenta muito útil para a elaboração de gráficos ou relatórios ou qualquer outro lugar onde se deseja resumir os dados a serem apresentados.

Considere a tabela ORDERS do banco de dados NORTHWIND do MSSQL com os seguintes campos:

Coluna Tipo Observações
OrderID Inteiro Chave primária da tabela
CustomerID nchar(5) Chave estrangeira para o ID de customer
EmployeeID Inteiro Chave estrangeira para ID de employee

Para referenciarmos os clientes vamos usar a tabela Customers usando o campo CompanyName da mesma.

Estes campos são o suficiente para o exemplo que eu quero dar. Considere que você deseje os clientes que tiveram um total de mais de cinco compras registradas nesta tabela. A consulta SQL típica para isto ficaria da seguite forma:

select count(o.OrderID) as CustomerOrders
    ,c.CompanyName
from orders o
join customers c on c.CustomerID=o.CustomerID
group by c.CompanyName
having count(o.OrderID)>5

Esta consulta traz um resultado parecido com o da figura abaixo:

image

O que eu quero demonstrar é como fazer esta consulta sem que seja exibida a contagem da tabela orders e assim, somente o nome dos clientes seja exibido.

A cláusula HAVING deve ser usada como filtro para ser aplicado a um resultado de cálculo feito por função de agregação. No caso da consulta acima, foi usado para que somente registros que tenham mais de cinco ocorrências na tabela Orders sejam trazidos. Para não exibir a contagem é só omitir a função na lista de colunas da instrução SELECT, mas, lembrando de incluir a tabela que se deseja realizar a operação e também a cláusula HAVING. A instrução deve ficar parecida com o seguinte exemplo:

select c.CompanyName
from orders o
join customers c  on c.CustomerID=o.CustomerID
group by c.CompanyName
having count(o.OrderId)>5

Com isso o resultado fica parecido com o da figura seguinte, note que o resultado é o mesmo, omitindo-se apenas a contagem dos registros em Orders.

image

Espero com isto ter contribuído de alguma forma. Em breve coloco mais dicas de utilização das instruções SQL. Até lá.