Voltar para a lista de artigos Artigos
6 minutos de leitura

Usando GROUP BY em SQL

Agora que você conhece os comandos centrais do SQL, aumente suas consultas com a cláusula GROUP BY e funções agregadas.

GROUP BY é uma cláusula SQL que organiza os dados em grupos com base em um valor (ou valores) comum. É amplamente utilizada para obter informações resumidas para grandes conjuntos de dados, bem como para computar estatísticas básicas agregadas.

Uma vez que você tenha compreendido os comandos básicos de SQL como SELECT, WHERE e JOIN, o domínio da cláusula GROUP BY pode ajudá-lo a implementar seu conhecimento de SQL em cenários de inteligência empresarial do mundo real.

SQL GROUP BY é mais freqüentemente usado em combinação com funções agregadas como COUNT(), MAX(), MIN(), SUM(), e AVG(). Ele agrupa o resultado definido por uma ou mais colunas, essencialmente criando linhas de resumo para cada grupo. Estes grupos são geralmente baseados em valores categóricos e não contínuos.

Por exemplo, se você estiver usando um conjunto de dados de clientes globais para seu negócio, você pode usar a cláusula GROUP BY para resumir informações como o "número total de clientes por cada país" ou o "total de vendas por cliente".

GROUP BY Sintaxe

Agora que sabemos o que é a cláusula GROUP BY, vamos olhar a sintaxe de uma consulta básica GROUP BY.

SELECT column_name(s)
FROM table_name
WHERE [condition]
GROUP BY column_name1, column_name2
HAVING [condition]
ORDER BY column_name

Aqui:

  • SELECT é a consulta padrão do SQL SELECT.
  • GROUP BY column_name1 realiza o agrupamento baseado em valores em column_name1.
  • column_name2 é usado quando o agrupamento é feito em mais de uma coluna; é possível agrupar por qualquer número de colunas. Isto é opcional.
  • HAVING [condition] e WHERE [condition] também são opcionais; ambos são usados para restringir as linhas afetadas pela cláusula GROUP BY. A principal diferença é que WHERE filtra as linhas antes de agrupar e HAVING filtra os próprios grupos uma vez formados. Importante: WHERE deve preceder a cláusula GROUP BY e HAVING deve segui-la.
  • ORDER BY [condition] é usado após GROUP BY para ordenar ou ordenar os dados por um determinado column_name.

No início, GROUP BY e ORDER BY parecem fazer a mesma coisa - ordenar os dados. Mas é aí que suas semelhanças terminam. Como o nome sugere, ORDER BY simplesmente ordena o conjunto de dados completo em uma ordem definida, enquanto GROUP BY agrupa os dados como uma saída agregada. Nosso artigo anterior, The Difference Between GROUP BY and ORDER BY in Simple Words, explica isso com mais detalhes; verifique se você precisa de uma atualização.

Agora, vamos ver como a cláusula GROUP BY funciona com consultas reais.

GROUP BY uma única coluna

Para ajudar a entender o efeito da cláusula GROUP BY, vamos executar uma simples consulta sobre o Orders tabela, que registrou 196 pedidos individuais. Abaixo, você pode ver as cinco primeiras entradas na tabela:

OrderIDCustomerIDEmployeeIDOrderDateShipperID
102489051996-07-043
102498161996-07-051
102503441996-07-082
102518431996-07-081
102527641996-07-092

Usando a tabela de Orders tabela, vamos descobrir quantos clientes únicos fizeram um pedido. Aqui está a pergunta:

SELECT CustomerID 
FROM Orders
GROUP BY CustomerID

RESULTADO

Number of Records: 74
CustomerID
2
3
4
5
7

Este é um exemplo de uma simples cláusula GROUP BY em uma única coluna (CustomerID); a saída coloca todas as linhas com o mesmo valor para a coluna CustomerID no mesmo grupo. Também devolve o número de clientes únicos que fizeram um pedido (74). Essencialmente, uma cláusula GROUP BY sem uma função agregada comporta-se de forma semelhante a uma cláusula DISTINCT: ela encontra os valores únicos em uma coluna.

O agrupamento também pode ser feito por várias colunas. Isto é mais útil quando usado com função(ões) agregada(s).

Agrupamento com funções agregadas

A aplicação prática do comando GROUP BY da SQL está resumindo parâmetros estatísticos para grupos de dados; isto é normalmente conseguido com funções agregadas. Vamos explorar alguns exemplos agora, usando o comando Orders tabelas e o OrderDetails tabela, cuja amostra é mostrada abaixo:

OrderDetailIDOrderIDProductIDQuantity
1102481112
2102484210
310248725
410249149
5102495140

MAX(), MIN(), AVG(), SUM()

GROUP BY é perfeita para resumir os parâmetros estatísticos de categorias individuais em seu conjunto de dados. Por exemplo, vamos tentar encontrar a quantidade máxima, mínima e média de cada ProductID por pedido e o número total de cada produto encomendado. Vamos utilizar o OrderDetails e colocar os resultados em ordem decrescente pela soma das quantidades encomendadas para cada produto. Isto esclarecerá os mais populares ProductIDs. Aqui está a consulta:

SELECT ProductID, MAX(Quantity), Min(Quantity), AVG(Quantity), SUM (Quantity)
FROM OrderDetails
GROUP BY ProductID
Order By SUM(Quantity) DESC

RESULTADO

Number of Records: 77
ProductIDMAX(Quantity)Min(Quantity)AVG(Quantity)SUM (Quantity)
3170432.714285714285715458
6080635.833333333333336430
35100441369
5970624.714285714285715346
260731341

A tabela abaixo decompõe como alguns desses valores agregados são calculados para os valores 2 e 31 do ProductID. A cláusula GROUP BY primeiro agrupa as linhas para ProductID 2 e depois calcula os valores AVG() e MAX() para o grupo inteiro. Ela faz o mesmo para cada ProductID para cada uma das funções agregadas na consulta.

ProductIDQuantityAverage (?Quantity/# of ProductID)Max (Quantity)
2603160
250
245
240
235
…………
317032.71470
3160
3156
3142
3140
…………

Como você vê, o comando GROUP BY é uma ferramenta extremamente útil para encontrar resumos estatísticos para qualquer classe de variáveis.

GROUP BY Múltiplas Colunas com COUNT()

Como mencionado anteriormente, você pode usar várias colunas no GROUP BY. Em outras palavras, você está colocando todas as linhas com os mesmos valores tanto em column_name1 como em column_name2 em um grupo.

Vamos considerar um exemplo onde queremos contar o número de vezes que cada funcionário usou cada serviço de remessa. Mais uma vez, vamos usar o Orders mesa.

SELECT EmployeeID, ShipperID, COUNT(*)
FROM Orders
Group BY EmployeeID, ShipperID
Order BY ShipperID, Count(*) DESC

RESULTADO

Number of Records: 26
EmployeeIDShipperIDCOUNT(*)
4112
118
217
317
617
…….…….…….

Esta consulta poderia ser utilizada, por exemplo, para obter feedback sobre o serviço de atendimento ao cliente dos expedidores por parte dos funcionários que utilizaram esse serviço. Como podemos ver acima, existem 26 pares de interação únicos entre funcionários e remetentes!

Como funciona o agrupamento por duas colunas nos bastidores? Linhas com o mesmo EmployeeID e ShipperID são emparelhadas em um único grupo. O tamanho desses grupos (ou seja, o número de registros no grupo) é calculado, como você pode ver abaixo:

EmployeeIDShipperIDCount
11
11
1112
11
11
………….
41
41
418
41
41
………….

O comando GROUP BY é também uma ferramenta poderosa que pode ser combinada com as cláusulas SQL HAVING e WHERE para definir condições adicionais para os resultados retornados.

Tenha em mente que existem certas sutilezas quando GROUP BY é usado com colunas que têm NULL valores. Consulte nosso artigo anterior sobre Erros comuns GROUP BY para obter alguns detalhes adicionais.

Dominando o SQL GROUP BY

Escusado será dizer que somente a prática o fará dominar este comando! A prática é melhor feita em conjuntos de dados do mundo real, onde você pode visualizar e se relacionar com as necessidades do negócio. O SQL para Iniciantes O curso inclui um conjunto abrangente de exercícios interativos. Você aprenderá como agrupar linhas e calcular estatísticas com funções agregadas em conjuntos de dados práticos. Experimente, e boa sorte!