TOP

Lição SQL 8. Agrupamento de dados (GROUP BY)

O agrupamento de dados permite dividir todos os dados em conjuntos lógicos, o que possibilita realizar cálculos estatísticos separadamente em cada grupo.


1. Criando grupos (GROUP BY)

Os grupos são criados usando a instrução GROUP BY do operador SELECT. Vamos considerar um exemplo.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

Com essa solicitação extraímos informações sobre a quantidade de produtos vendidos em cada mês. O operador SELECT ordena a saída de duas colunas Produto - o nome do produto e Product_num - o campo calculado que criamos para exibir a quantidade de produtos vendidos (fórmula do campo SUM(Quantity)). A cláusula GROUP BY informa ao DBMS para agrupar os dados pela coluna Produto.

Também é importante notar que GROUP BY deve vir depois da cláusula WHERE e antes de ORDER BY.

2. Filtrando grupos (HAVING)

Assim como filtramos as linhas em uma tabela, podemos filtrar dados agrupados. Para isso, existe o operador HAVING no SQL. Vamos pegar o exemplo anterior e adicionar filtragem de grupo.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Podemos ver que após o cálculo do número de mercadorias vendidas para cada produto, o SGBD “cortou” os produtos que foram vendidos menos de 4.000 unidades.

Como você pode ver, o operador HAVING é muito semelhante ao operador WHERE, mas há uma diferença significativa entre eles: WHERE filtra os dados antes de serem agrupados e HAVING filtra após o agrupamento. Assim, as linhas que foram removidas pela cláusula WHERE não serão incluídas no grupo. Portanto, os operadores WHERE e HAVING podem ser usados na mesma frase. Considere um exemplo:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

Adicionamos o operador WHERE ao exemplo anterior, onde especificamos o produto "Skis Long", que por sua vez afetou o agrupamento pelo operador HAVING. Como resultado, podemos perceber que o produto “Esquis Longos” não entrou na lista de grupos com mais de 4.000 produtos vendidos.

3. Agrupamento e classificação

Tal como acontece com a amostragem normal de dados, podemos classificar os grupos após o agrupamento com o operador HAVING. Para isso, podemos usar o já conhecido operador ORDER BY. Nesta situação, a sua aplicação é semelhante aos exemplos anteriores. Exemplo:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

ou simplesmente especifique o número do campo na ordem em que queremos classificar:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

Vemos que para classificar os resultados resumidos, precisamos apenas escrever a cláusula com ORDER BY após o operador HAVING.

MS Access não suporta ordenação de grupos por aliases de coluna, ou seja, em nosso exemplo, para ordenar os valores, não poderemos escrever ORDER BY Product_num no final da consulta.