SQL Server Essentials: Utilizando a Cláusula GROUP BY do SQL

A linguagem de consulta T-SQL do SQL Server possui uma infinidade de opções de recuperação de dados. Isso inclui a capacidade de consultar um banco de dados SQL, bem como fornecer uma função de soma, uma função de agregação de contagem e agrupamento de colunas. A cláusula GROUP BY do SQL pode fazer uso de todas essas capacidades. Neste artigo, vou mostrar como a cláusula GROUP BY pode ser usada sozinha ou em conjunto com uma das funções de agregação para realizar cálculos com base no agrupamento.

Como funciona a cláusula GROUP BY do SQL?

A cláusula GROUP BY do SQL é usada com a instrução SELECT para organizar dados em grupos de dados idênticos. Ela segue a cláusula WHERE em uma instrução SELECT.

Publicidade

Esta cláusula é mais frequentemente usada com funções de agregação como SUM, COUNT, AVG, MAX ou MIN, que permitem que você faça cálculos com dados agrupados. Você pode agrupar os dados por qualquer tipo de coluna diferente, incluindo números como IDs de produtos, datas ou caracteres como descrições.

A sintaxe básica do GROUP BY é bastante simples:

SELECT column1, aggregate_function(column2)
FROM table_name
GROUP BY column1;

Aqui, você pode ver a cláusula GROUP BY usada com uma instrução SELECT básica. A instrução SELECT recupera duas colunas, e a segunda coluna usa uma função de agregação.

O uso de uma função de agregação não é tecnicamente necessário, mas é um complemento muito comum à cláusula GROUP BY. O agrupamento será realizado nos dados contidos na primeira coluna.

Publicidade

Vamos mergulhar mais fundo e ver a cláusula GROUP BY em ação.

Usando o GROUP BY do SQL com uma instrução SELECT

Primeiro, vamos ver apenas o uso da cláusula GROUP BY do SQL com uma simples instrução SELECT sem adicionar uma função de agregação. A listagem a seguir recupera e agrupa a coluna ‘ID do Produto’ da tabela SalesLT.SalesOrderDetail no banco de dados de exemplo AdventureWorksLT2019.

USE AdventureWorksLT2019;

SELECT ProductID FROM SalesLT.SalesOrderDetail
  GROUP BY ProductID;

Essencialmente, isso retorna uma lista de todos os IDs de produtos que foram pedidos, como você pode ver na figura a seguir.

We get a list of all of the ProductIDs that have been ordered (Image credit: Petri/Michael Otey)

Usando o GROUP BY do SQL com funções de agregação

É mais comum usar a cláusula GROUP BY do SQL juntamente com uma das funções de agregação que podem fornecer uma contagem, total, média ou resumo de todas as colunas que você agrupou. A seguinte declaração usa o GROUP BY com a tabela SalesLT.Product do banco de dados AdventureWorksLT2019 para encontrar o número total de produtos em cada categoria de produto:

Publicidade

USE AdventureWorksLT2019;

SELECT ProductCategoryID, COUNT(*) AS TotalProducts
  FROM SalesLT.Product
   GROUP BY ProductCategoryID;

Neste exemplo, a declaração SELECT retorna a coluna ‘ProductCategoryID’ da tabela SalesLT.Product e conta o número de produtos em cada categoria usando a função de agregação COUNT(*). Aqui, a cláusula GROUP BY agrupa os resultados pelo ‘ProductCategoryID’ enquanto a função SELECT COUNT calcula o número total de produtos em cada categoria de produto. Os resultados da função COUNT(*) usam o alias ‘TotalProducts’.

Os resultados desta consulta são mostrados na figura a seguir. Esta saída mostra o número total de produtos em cada categoria de produto, conforme calculado usando a cláusula GROUP BY. As informações de resumo são retornadas pela função de agregação COUNT(*).

Using SQL GROUP BY with aggregate functions (Image credit: Petri/Michael Otey)

Usando o SQL GROUP BY com várias colunas

A função SQL GROUP BY não se limita a trabalhar com uma única coluna. Também pode ser usada com várias colunas simultaneamente na mesma consulta.

Vamos dar uma olhada em um exemplo de uso da cláusula GROUP BY com duas colunas da tabela SalesLT.Product no banco de dados AdventureWorksLT2019. A consulta a seguir mostra como recuperar o número total de produtos para cada categoria de produto e modelo de produto.

USE AdventureWorksLT2019;

SELECT ProductCategoryID, ProductModelID, COUNT(*) AS TotalProducts
  FROM SalesLT.Product
  GROUP BY ProductCategoryID, ProductModelID;

Aqui, as colunas ‘ProductCategoryID’ e ‘ProductModelID’ são ambas recuperadas e estamos usando a função de agregação COUNT(*) para contar o número de produtos em cada categoria e subcategoria de produto. Neste exemplo, a cláusula GROUP BY agrupa os resultados das colunas ‘ProductCategoryID’ e ‘ProductModelID’. Isso cria dois grupos distintos com base nas duas colunas diferentes.

Você pode ver os resultados desta consulta na figura a seguir. Esses resultados mostram o número total de produtos e modelos de produtos, e a contagem total é recuperada usando o alias da coluna TotalProducts.

Using SQL GROUP BY with multiple columns (Image credit: Petri/Michael Otey)

Usando o SQL GROUP BY com a cláusula HAVING

Outro uso comum da cláusula GROUP BY é combiná-la com a cláusula HAVING. De fato, você pode usar a cláusula GROUP BY com a cláusula HAVING para filtrar os resultados de uma consulta com base nas condições que a cláusula HAVING aplica aos agrupamentos de dados. A condição pode ser aplicada a uma coluna de tipo de dados regular ou a uma função de agregação.

Vamos analisar um exemplo de uso da cláusula SQL GROUP BY em conjunto com a cláusula HAVING com o banco de dados AdventureWorksLT2019. Este exemplo mostra quais clientes fizeram pedidos na tabela SalesLT.SalesOrderHeader com um valor total de pedido maior que $2000. Aqui, a cláusula GROUP BY é usada para agrupar pedidos por cliente e, em seguida, a cláusula HAVING filtra clientes com base no valor total do pedido.

USE AdventureWorksLT2019;

SELECT  c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount
  FROM SalesLT.Customer c
 JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  GROUP BY c.CustomerID, c.FirstName, c.LastName
 HAVING SUM(soh.TotalDue) > 2000;
  • Nesta listagem de código, a tabela SalesLT.Customer é unida com a tabela SalesLT.SalesOrderHeader na coluna ‘CustomerID’.
  • A lista SELECT recupera o ‘CustomerID’, ‘FirstName’, ‘LastName’ e ‘TotalOrderAmount’.
  • A cláusula GROUP BY é usada para agrupar os resultados por cliente.
  • A função agregada SUM() calcula o valor total do pedido para cada cliente.
  • A cláusula HAVING filtra os resultados agrupados para selecionar apenas clientes cujo valor total do pedido é maior que $2000.

Você pode ver os resultados desta listagem de código na figura a seguir:

Using SQL GROUP BY with the HAVING clause (Image credit: Petri/Michael Otey)

Usando a cláusula SQL GROUP BY com a cláusula ORDER BY

Você também pode usar a cláusula GROUP BY do SQL com a cláusula ORDER BY para classificar o conjunto de resultados por uma ou mais colunas. O exemplo a seguir usa o banco de dados AdventureWorksLT2019. Para ilustrar o uso da cláusula ORDER BY com a cláusula GROUP BY, você pode simplesmente pegar o código do exemplo anterior e adicionar a cláusula ORDER BY para classificar os resultados exibindo os maiores valores de pedidos em ordem decrescente.

USE AdventureWorksLT2019;

SELECT  c.CustomerID, c.FirstName, c.LastName, SUM(soh.TotalDue) AS TotalOrderAmount
  FROM SalesLT.Customer c
   JOIN SalesLT.SalesOrderHeader soh ON c.CustomerID = soh.CustomerID
  GROUP BY c.CustomerID, c.FirstName, c.LastName
   HAVING SUM(soh.TotalDue) > 2000
   ORDER BY TotalOrderAmount DESC;

Você pode ver os resultados na figura a seguir. Esses resultados mostram a lista de clientes com pedidos acima de $2000 em ordem decrescente, com os clientes que têm os maiores pedidos no topo.

Using SQL GROUP BY with the ORDER BY clause (Image credit: Petri/Michael Otey)

Como você pode ver, você pode fazer muitas coisas com a cláusula GROUP BY do SQL. Eu mostrei como a cláusula GROUP BY pode ser usada com várias colunas, bem como como as cláusulas HAVING e ORDER BY podem ser adicionadas para filtrar e classificar os resultados.

Como de costume, sinta-se à vontade para fazer qualquer pergunta sobre a cláusula GROUP BY do SQL. E se você quiser aprender mais sobre o SQL Server, fique à vontade para conferir artigos anteriores na minha série SQL Server Essential.

Source:
https://petri.com/sql-group-by/