Noções básicas do SQL Server: Usando a cláusula GROUP BY do SQL

A linguagem de consulta T-SQL do SQL Server tem 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, mostrarei 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 os dados em grupos de dados idênticos. Essa cláusula segue a cláusula WHERE em uma instrução SELECT.  

Publicidade

Essa 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 um dos diferentes tipos de coluna, 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 obrigatório, mas é um complemento muito comum à cláusula GROUP BY. O agrupamento será realizado nos dados contidos na primeira coluna.

Anúncio

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

Usando a cláusula GROUP BY de SQL com uma instrução SELECT

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

USE AdventureWorksLT2019;

SELECT ProductID FROM SalesLT.SalesOrderDetail
  GROUP BY ProductID;

Isso retorna essencialmente uma lista de todos os ProductIDs 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 a cláusula GROUP BY 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 de 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 seguinte figura. Esta saída mostra o número total de produtos em cada categoria, calculado usando a cláusula GROUP BY. As informações resumidas são retornadas pela função de agregação COUNT(*).

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

Usando SQL GROUP BY com múltiplas colunas

A função SQL GROUP BY não se limita a trabalhar com uma única coluna. Ela 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 agregada 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 de coluna TotalProducts.

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

Usando o GROUP BY do SQL 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 às agrupamentos de dados. A condição pode ser aplicada a uma coluna de tipo de dado regular ou a uma função agregada.

Vamos ver um exemplo de uso da cláusula GROUP BY do SQL juntamente 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 do pedido maior que $2000. Aqui, a cláusula GROUP BY é usada para agrupar os pedidos por cliente e, em seguida, a cláusula HAVING filtra os 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 ‘CustomerID’, ‘FirstName’, ‘LastName’ e ‘TotalOrderAmount’.
  • A cláusula GROUP BY é usada para agrupar os resultados por cliente.
  • A função de agregação SUM() calcula o valor total do pedido para cada cliente.
  • A cláusula HAVING filtra os resultados agrupados para selecionar apenas os 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 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 descendente.

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 seguinte figura. Esses resultados mostram a lista de clientes com pedidos acima de $2000 em ordem descendente, com os clientes que possuem 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/