# 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 ...)).