---
# System prepended metadata

title: LIsta de Exericios JOIN

---

# Lista de exericios sobre JOIN

## 1- Utilize os dados que estão nesse GITHUB:
[https://github.com/leoinfnet/lista_exercicio_joins_sql_2025][dados!]

### 2- Voce deverá criar o container, criar o schema, e database criar as tabelas e inserir os dados.


# Exercícios 1–20

### 1 - (pedidos × clientes).
Liste pedido.id, cliente.nome, pedido.criado_em. Ordene por pedido.criado_em desc.

### 2 -com cupom opcional.
Traga pedido.id, COALESCE(cupons.codigo, 'SEM_CUPOM') AS cupom, COALESCE(cupons.percentual, 0) AS desconto_percentual.

### 3 - : vendedores sem livros.
Liste todos os vendedores com COUNT(livros.id) (pode ser 0). Mostre vendedor.id, vendedor.nome_fantasia, qtde_livros. Ordene por qtde_livros asc.

### 4-  (categorias pai/filha).
Mostre categoria_filha.nome AS filha, categoria_pai.nome AS pai. Inclua categorias raiz (sem pai) usando LEFT JOIN em si mesma.

### 5 - (grade de horários).
Gere combinações dias × horas. Filtre apenas horários de 09:00 a 18:00. Mostre dia, hora.
(Se não criar tabelas dias/horas, pode usar CTEs para gerar séries.)

### 6 - JOIN em cadeia (pedidos → itens → livros).
Mostre pedido.id, livro.titulo, itens.quantidade, itens.preco_unitario, ROUND(itens.quantidade * itens.preco_unitario, 2) AS subtotal.

### 7 - CASE por faixa de preço.
Liste livros com CASE que classifica preco: 'barato' (<30), 'medio' (30–80), 'caro' (>80). Inclua categoria.nome via LEFT JOIN.

### 8 - Cidades com e sem clientes 
Traga cidades.nome, COUNT(clientes.id) AS qtde_clientes, incluindo cidades sem clientes. Ordene por qtde_clientes desc.

### 9 - Faturamento por vendedor no mês .
Para o mês corrente (DATE_TRUNC('month', pedidos.criado_em)), some itens.quantidade * itens.preco_unitario por vendedor. Inclua vendedores sem vendas no mês com COALESCE(total, 0).

### 10 - Livros nunca vendidos 
Liste livros que não aparecem em itens_pedido (WHERE itens_pedido.livro_id IS NULL).

### 11 - Clientes sem pedidos 
Liste clientes sem pedidos e mostre a cidade.nome.

### 12 - Desconto total por cupom 
Para cada cupom ativo, calcule desconto_total = SUM((percentual/100) * itens.quantidade * itens.preco_unitario) considerando apenas pedidos que usaram o cupom. Mostre cupom.codigo, ROUND(desconto_total, 2).

### 13 - TOP 5 categorias por faturamento 
Some o faturamento bruto por categoria. Filtre com HAVING SUM(...) > 1000. Traga top 5 (ORDER BY total DESC LIMIT 5).

### 14 - Ticket médio por cliente 
Calcule ticket_medio = SUM(valor_pedido)/COUNT(pedidos) onde valor_pedido é a soma de itens. Mostre cliente.nome, ROUND(ticket_medio, 2). HAVING COUNT(DISTINCT pedidos.id) >= 3.

### 15 - Distribuição por status 
Conte pedidos por COALESCE(status, 'INDEFINIDO'). (Pode complementar com total geral via GROUP BY ROLLUP se quiser sofisticar.)

### 16 - Pagamentos por meio 
Liste pedido.id, pagamentos.meio, SUM(pagamentos.valor). Inclua pedidos sem pagamento (COALESCE para 0). Agrupe de forma consistente.

### 17 - Estoque vs vendido 
Mostre livro.id, livro.titulo, estoque, vendido_total (soma de itens.quantidade), e CASE WHEN estoque - vendido_total < 0 THEN 'NEGATIVO' ELSE 'OK' END AS status_estoque.

### 18 - Hierarquia 2–3 níveis 
Mostre cat_pai.nome, cat_filha.nome, cat_neta.nome (se existir). Use LEFT JOIN para não perder linhas sem neta.

### 19 - CROSS JOIN “controlado” 
Gere cidades × vendedores e filtre no WHERE apenas combinações onde vendedor.cidade_id = cidades.id ou cidades.uf = 'SP'. Observe como o WHERE “estreita” o CROSS JOIN.

### 20- Clientes ativos no mês
Conte clientes com ≥1 pedido no mês corrente e clientes sem pedido no mês. Mostre ativos_mes e inativos_mes (pode ser uma única query com SUM(CASE ...)).