🎯 Faltam poucos dias para este mês Apoie SQLTest.online e ajude-nos a manter a prática de SQL gratuita para todos. Doe hoje →
Código SQL copiado para a área de transferência

Agrupando Dados com GROUP BY

Lição 4.2 · Tempo de leitura: ~7 minutos · Tarefas para praticar ↓

Agrupamento transforma linhas individuais em métricas categorizadas. GROUP BY é essencial para relatórios onde você precisa de totais por categoria, data ou outra dimensão. Nesta lição, você aprenderá a sintaxe GROUP BY, a regra central e exemplos práticos com Sakila. Ao final, conseguirá construir consultas analíticas com agrupamento.

Na lição anterior, você descobriu as funções de agregação. Agora vamos ao próximo passo: aplicar essas funções a diferentes categorias de dados.

GROUP BY faz isso dividindo os dados em grupos e calculando métricas para cada grupo separadamente.

SQL GROUP BY: 16049 linhas de payment viram uma linha por staff_id com COUNT e SUM, etapas FROM, GROUP BY, SELECT

Sintaxe do GROUP BY

Estrutura básica:

SELECT coluna1, FUNCAO_AGG(coluna2)
FROM tabela
GROUP BY coluna1;

A Regra Central

Quando você usa GROUP BY, toda coluna em SELECT deve:

  • ou estar na lista GROUP BY;
  • ou estar envolvida por uma função de agregação (SUM, COUNT, AVG, MIN, MAX).

Essa regra impede ambiguidade: SQL precisa saber qual valor retornar quando um grupo tem múltiplas linhas.

Agrupamento por Uma Coluna

Total de pagamentos por cliente

SELECT customer_id, SUM(amount) AS total_paid
FROM payment
GROUP BY customer_id;

Resultado: uma linha por cliente com a soma de seus pagamentos.

Número de pagamentos por funcionário

SELECT staff_id, COUNT(*) AS payments_count
FROM payment
GROUP BY staff_id;

Resultado: para cada funcionário, o número de pagamentos processados.

Pagamento médio por data

SELECT DATE(payment_date) AS pay_date, AVG(amount) AS avg_payment
FROM payment
GROUP BY DATE(payment_date);

Resultado: para cada data, o valor médio dos pagamentos.

Variante: GROUP BY com alias

SELECT DATE(payment_date) AS pay_date, AVG(amount) AS avg_payment
FROM payment
GROUP BY pay_date;

Nota: isso funciona em MySQL/MariaDB, mas não em todos os SGBDs. Para compatibilidade multi-SGBD, escreva GROUP BY DATE(payment_date) completamente.


Agrupamento por Múltiplas Colunas

Você pode agrupar por múltiplos campos simultaneamente para uma análise mais detalhada.

Total de pagamentos por funcionário e cliente

SELECT staff_id, customer_id, SUM(amount) AS total_paid
FROM payment
GROUP BY staff_id, customer_id;

Resultado: uma linha por par (funcionário, cliente) com seu total de pagamentos.


Exemplos Práticos

Relatório de receita por dia

SELECT DATE(payment_date) AS pay_date, SUM(amount) AS total_sales
FROM payment
GROUP BY DATE(payment_date)
ORDER BY pay_date;

Clientes mais ativos por número de locações

SELECT customer_id, COUNT(*) AS rentals_count
FROM rental
GROUP BY customer_id
ORDER BY rentals_count DESC;

Taxa média de aluguel por categoria de filme

SELECT category_id, AVG(rental_rate) AS avg_rental_rate
FROM film f
JOIN film_category fc ON f.film_id = fc.film_id
GROUP BY category_id;

Perguntas Frequentes

Por que não posso selecionar qualquer coluna se usar GROUP BY?

Porque as funções de agregação (SUM, COUNT, AVG) já indicam como tratar todas as linhas do grupo. Se uma coluna não for agregada, ela deve estar em GROUP BY para que SQL saiba qual valor escolher.

Posso agrupar por uma expressão em vez de uma coluna?

Sim, por exemplo GROUP BY DATE(payment_date) ou GROUP BY YEAR(payment_date). A expressão deve corresponder em SELECT e GROUP BY.

O que acontece se GROUP BY estiver vazio?

É um erro de sintaxe. GROUP BY sempre precisa ter pelo menos uma coluna ou expressão.


Perguntas de Entrevista

O que e GROUP BY e por que precisamos dela?

GROUP BY combina linhas em que as colunas selecionadas têm valores idênticos em um único grupo. Você pode então aplicar funções de agregação a cada grupo para obter estatísticas resumidas.

Por que não posso escolher arbitrariamente uma coluna com GROUP BY?

Porque um grupo pode ter múltiplas linhas com valores diferentes naquela coluna. SQL precisa saber qual valor retornar, caso contrário o resultado é ambíguo. A coluna deve estar em GROUP BY ou dentro de uma função de agregação.

Qual e a diferença entre WHERE e HAVING?

WHERE filtra linhas ANTES do agrupamento, enquanto HAVING filtra grupos DEPOIS do agrupamento. Por exemplo, WHERE amount > 10 exclui linhas antes do agrupamento, enquanto HAVING SUM(amount) > 100 exclui grupos cuja soma é menor que 100.


Principais conclusões desta lição:

  • GROUP BY divide dados em grupos e aplica agregações a cada um.
  • Regra central: todas as colunas SELECT em GROUP BY ou em uma função de agregação.
  • Você pode agrupar por uma ou múltiplas colunas simultaneamente.
  • Você pode agrupar por expressões, como GROUP BY DATE(payment_date).
  • GROUP BY alimenta relatórios, análise e resumos por categoria.

Tente resolver as tarefas a seguir para reforcar o que voce aprendeu nesta licao.

  1. Conte os pinguins
  2. Encontre a distribuição de filmes por categoria
  3. Duração média de aluguel de filmes para cada cliente
  4. O custo médio de aluguel de um filme por categoria
  5. Analise o pagamento mensal