8

Funções de Agregação

Intermediário • 70 minutos • Análise de dados

Aprenda a usar funções de agregação para calcular estatísticas, somas, médias e agrupar dados para análises poderosas.

Objetivos de Aprendizagem

O que são Funções de Agregação?

Funções de agregação processam múltiplas linhas de dados e retornam um único valor. São essenciais para análises, relatórios e estatísticas.

🎯 Para que servem?

  • Contar: Quantos registros existem?
  • Somar: Qual o total de vendas?
  • Calcular médias: Qual o preço médio dos produtos?
  • Encontrar extremos: Qual o maior/menor valor?
  • Agrupar dados: Vendas por categoria, por mês, etc.

Principais Funções

COUNT()

Conta registros

SUM()

Soma valores

AVG()

Calcula média

MIN()

Menor valor

MAX()

Maior valor

GROUP BY

Agrupa dados

COUNT() - Contando Registros

A função COUNT() conta o número de registros que atendem a uma condição.

Variações do COUNT

COUNT(*) - Conta todas as linhas

-- Quantos produtos existem?
SELECT COUNT(*) as total_produtos
FROM produtos;

Conta todas as linhas, incluindo valores NULL

COUNT(coluna) - Conta valores não-nulos

-- Quantos produtos têm descrição?
SELECT COUNT(descricao) as produtos_com_descricao
FROM produtos;

Ignora valores NULL na coluna especificada

COUNT(DISTINCT) - Conta valores únicos

-- Quantas categorias diferentes existem?
SELECT COUNT(DISTINCT categoria_id) as total_categorias
FROM produtos;

Conta apenas valores únicos (sem repetições)

Dica:

Use COUNT(*) para contar linhas totais e COUNT(coluna) para verificar completude dos dados.

SUM() e AVG() - Soma e Média

SUM() - Soma valores

-- Total de vendas
SELECT SUM(valor_total) as vendas_totais
FROM vendas;

-- Estoque total por categoria
SELECT categoria_id, SUM(estoque) as estoque_total
FROM produtos
GROUP BY categoria_id;

Uso: Totais financeiros, quantidades, estoques

AVG() - Calcula média

-- Preço médio dos produtos
SELECT AVG(preco) as preco_medio
FROM produtos;

-- Ticket médio por categoria
SELECT categoria_id, AVG(preco) as ticket_medio
FROM produtos
GROUP BY categoria_id;

Uso: Médias de preços, notas, idades, tempos

Exemplo Prático: Análise de Vendas

-- Relatório completo de vendas
SELECT 
    COUNT(*) as total_vendas,
    SUM(valor_total) as faturamento_total,
    AVG(valor_total) as ticket_medio,
    SUM(quantidade) as itens_vendidos
FROM vendas
WHERE data_venda >= '2024-01-01';

Atenção:

SUM() e AVG() ignoram valores NULL. Se uma coluna tem muitos NULLs, o resultado pode não representar a realidade.

MIN() e MAX() - Valores Extremos

MIN() e MAX() encontram os menores e maiores valores em uma coluna.

MIN() - Menor valor

-- Produto mais barato
SELECT MIN(preco) as menor_preco
FROM produtos;

-- Data da primeira venda
SELECT MIN(data_venda) as primeira_venda
FROM vendas;

MAX() - Maior valor

-- Produto mais caro
SELECT MAX(preco) as maior_preco
FROM produtos;

-- Última venda registrada
SELECT MAX(data_venda) as ultima_venda
FROM vendas;

Encontrando Registros Completos

Para encontrar o registro completo (não apenas o valor), use subconsultas:

-- Produto mais caro (registro completo)
SELECT *
FROM produtos
WHERE preco = (SELECT MAX(preco) FROM produtos);

-- Venda com maior valor
SELECT *
FROM vendas
WHERE valor_total = (SELECT MAX(valor_total) FROM vendas);

Análise de Amplitude

-- Amplitude de preços por categoria
SELECT 
    categoria_id,
    MIN(preco) as preco_minimo,
    MAX(preco) as preco_maximo,
    MAX(preco) - MIN(preco) as amplitude
FROM produtos
GROUP BY categoria_id;

GROUP BY - Agrupando Dados

GROUP BY agrupa registros com valores iguais em uma ou mais colunas, permitindo aplicar funções de agregação a cada grupo.

Sintaxe Básica

SELECT coluna_agrupamento, FUNCAO_AGREGACAO(coluna)
FROM tabela
GROUP BY coluna_agrupamento;

Exemplos Práticos

1. Vendas por categoria

SELECT 
    categoria_id,
    COUNT(*) as total_produtos,
    AVG(preco) as preco_medio
FROM produtos
GROUP BY categoria_id;

Agrupa produtos por categoria e calcula estatísticas

2. Vendas por mês

SELECT 
    EXTRACT(YEAR FROM data_venda) as ano,
    EXTRACT(MONTH FROM data_venda) as mes,
    COUNT(*) as total_vendas,
    SUM(valor_total) as faturamento
FROM vendas
GROUP BY EXTRACT(YEAR FROM data_venda), EXTRACT(MONTH FROM data_venda)
ORDER BY ano, mes;

Agrupa vendas por ano e mês

3. Múltiplas colunas de agrupamento

SELECT 
    categoria_id,
    fornecedor_id,
    COUNT(*) as total_produtos,
    AVG(preco) as preco_medio
FROM produtos
GROUP BY categoria_id, fornecedor_id;

Agrupa por categoria E fornecedor

Regra Importante:

Toda coluna no SELECT que não é uma função de agregação DEVE estar no GROUP BY.

HAVING - Filtrando Grupos

HAVING é como WHERE, mas para grupos. Permite filtrar resultados após o agrupamento.

WHERE vs HAVING

WHERE

  • • Filtra registros ANTES do agrupamento
  • • Não pode usar funções de agregação
  • • Mais eficiente

HAVING

  • • Filtra grupos APÓS o agrupamento
  • • Pode usar funções de agregação
  • • Usado com GROUP BY

Exemplos Práticos

1. Categorias com mais de 5 produtos

SELECT 
    categoria_id,
    COUNT(*) as total_produtos
FROM produtos
GROUP BY categoria_id
HAVING COUNT(*) > 5;

Mostra apenas categorias com mais de 5 produtos

2. Clientes com compras acima de R$ 1000

SELECT 
    cliente_id,
    COUNT(*) as total_compras,
    SUM(valor_total) as total_gasto
FROM vendas
GROUP BY cliente_id
HAVING SUM(valor_total) > 1000;

Identifica clientes VIP

3. Combinando WHERE e HAVING

SELECT 
    categoria_id,
    AVG(preco) as preco_medio
FROM produtos
WHERE estoque > 0  -- Filtra antes do agrupamento
GROUP BY categoria_id
HAVING AVG(preco) > 100;  -- Filtra depois do agrupamento

Produtos em estoque, agrupados por categoria, com preço médio > R$ 100

Ordem de Execução

  1. 1 FROM: Seleciona a tabela
  2. 2 WHERE: Filtra registros individuais
  3. 3 GROUP BY: Agrupa os dados
  4. 4 HAVING: Filtra grupos
  5. 5 SELECT: Seleciona colunas
  6. 6 ORDER BY: Ordena resultados

Exemplos Avançados

1. Relatório de Vendas Completo

SELECT 
    c.nome as categoria,
    COUNT(v.id) as total_vendas,
    SUM(v.valor_total) as faturamento,
    AVG(v.valor_total) as ticket_medio,
    MIN(v.valor_total) as menor_venda,
    MAX(v.valor_total) as maior_venda
FROM vendas v
JOIN produtos p ON v.produto_id = p.id
JOIN categorias c ON p.categoria_id = c.id
WHERE v.data_venda >= '2024-01-01'
GROUP BY c.id, c.nome
HAVING COUNT(v.id) >= 10
ORDER BY faturamento DESC;

2. Análise de Performance por Fornecedor

SELECT 
    f.nome as fornecedor,
    COUNT(p.id) as produtos_cadastrados,
    AVG(p.preco) as preco_medio,
    SUM(p.estoque) as estoque_total,
    COUNT(CASE WHEN p.estoque = 0 THEN 1 END) as produtos_sem_estoque,
    ROUND(
        COUNT(CASE WHEN p.estoque = 0 THEN 1 END) * 100.0 / COUNT(p.id), 
        2
    ) as percentual_sem_estoque
FROM fornecedores f
LEFT JOIN produtos p ON f.id = p.fornecedor_id
GROUP BY f.id, f.nome
HAVING COUNT(p.id) > 0
ORDER BY percentual_sem_estoque ASC;

3. Top 5 Clientes por Período

SELECT 
    cliente_id,
    COUNT(*) as total_compras,
    SUM(valor_total) as total_gasto,
    AVG(valor_total) as ticket_medio,
    MAX(data_venda) as ultima_compra
FROM vendas
WHERE data_venda BETWEEN '2024-01-01' AND '2024-12-31'
GROUP BY cliente_id
HAVING COUNT(*) >= 3
ORDER BY total_gasto DESC
LIMIT 5;

Exercício Prático

Vamos praticar funções de agregação!

Complete as consultas SQL abaixo:

1. Complete a consulta para contar produtos por categoria:

SELECT categoria_id, ______(*)  as total
FROM produtos
______ __ categoria_id;

2. Qual função calcula a média de preços?

3. Complete para mostrar apenas categorias com mais de 3 produtos:

SELECT categoria_id, COUNT(*) as total
FROM produtos
GROUP BY categoria_id
______ COUNT(*) _ 3;

4. Qual a diferença entre WHERE e HAVING?

Resumo da Aula

  • COUNT(), SUM(), AVG(), MIN(), MAX() são as principais funções de agregação
  • GROUP BY agrupa dados para aplicar funções de agregação
  • HAVING filtra grupos após o agrupamento
  • WHERE filtra registros antes do agrupamento
  • Funções de agregação são essenciais para relatórios e análises
Aula Anterior: Atualizando e Excluindo Dados Próxima Aula: Subconsultas