Consulta em camadas: por que o SQL de 80 linhas é uma armadilha
Como pedir a consulta em pedaços que você consegue conferir, e a contagem de controle que acompanha cada camada.
Peça a análise inteira e vem um SQL de 80 linhas com quatro CTEs. Ele roda. Devolve uma tabela bonita. E você não tem como saber se está certo — só se está sem erro de sintaxe.
- Montar consultas em camadas conferíveis.
- Associar uma contagem de controle a cada camada.
- Encontrar o ponto exato onde o número deixa de bater.
A diferença entre código e análise aparece aqui de novo: um programa de 80 linhas errado costuma quebrar. Uma consulta de 80 linhas errada devolve uma tabela plausível. Não existe teste automático dizendo que o número está torto.
A substituição é a contagem de controle: a cada camada, um número que você consegue conferir contra algo conhecido. Se a camada 1 dá 3.412 pedidos e o financeiro fechou o mês com 3.412 pedidos, a camada 1 está certa. Se a camada 2 dá 11.847, você sabe exatamente onde a linha multiplicou.
WITH base AS (...), enriquecido AS (...),
agregado AS (...), final AS (...)
SELECT * FROM final;
-- resultado: uma tabela com 14 colunas e 38 linhasSe o número final estiver errado, você não tem como saber em qual das quatro camadas. Recomeça do zero.
-- Camada 1: universo de pedidos SELECT COUNT(*), SUM(valor) FROM pedidos WHERE criado_em >= '2026-03-01' AND criado_em < '2026-04-01' AND status NOT IN (3, 7); -- 3.412 | R$ 2.108.443,10 ✓ bate com o fechamento -- Camada 2: junta cliente (1:1 — não pode mudar a contagem) SELECT COUNT(*), SUM(p.valor) FROM pedidos p JOIN clientes c ON c.id = p.cliente_id WHERE ...; -- 3.401 | R$ 2.103.201,40 ✗ perdeu 11 pedidos! -- → 11 pedidos com cliente_id órfão. Investigar antes de seguir.
O problema apareceu na camada 2, com 11 pedidos identificados. Sem a contagem de controle, esses R$ 5 mil sumiriam em silêncio.
A diferença: A regra: toda junção que deveria ser 1:1 precisa preservar a contagem. Se mudou, ou há órfão (INNER JOIN perdendo linha) ou há duplicata na tabela da direita.
A tabela de controle da análise
| Camada | O que faz | Controle esperado |
|---|---|---|
| 1. Universo | Filtra período, status, exclusões | Bate com uma fonte externa |
| 2. Enriquecimento | Junta dimensões 1:1 | Contagem não muda |
| 3. Agregação de filhos | Soma itens, eventos | Contagem da camada 1 preservada |
| 4. Métrica | Calcula a taxa/média | Numerador ≤ denominador; nulos declarados |
| 5. Recorte | Quebra por segmento | Soma dos segmentos = total da camada 4 |
A camada 5 tem a conferência mais fácil e mais esquecida: se a soma dos segmentos não dá o total, algum registro caiu num segmento nulo que ninguém viu.
Preciso responder: [pergunta da especificação] Contexto: [cole o dicionário de dados] Especificação: [cole as definições fixadas] Monte a consulta em camadas separadas, NÃO em um bloco único. Para cada camada, entregue: - a consulta - o que ela deve produzir em uma frase - a CONTAGEM DE CONTROLE que eu devo checar antes de seguir - o que significa se o controle não bater Comece só pela camada 1. Espere eu confirmar o número antes de escrever a camada 2.
A última linha é o que impede as 80 linhas de aparecerem de uma vez. Custa mais mensagens e encontra o erro na camada em que ele nasceu.
Olhar as primeiras linhas de um SELECT * não revela duplicação: as 10 primeiras linhas parecem normais. A duplicata só aparece na contagem ou na soma.
Por isso a conferência é sempre COUNT(*) e SUM(), nunca "olhei o resultado e parecia certo".
Como perceber: Você validou uma consulta olhando o LIMIT 10.
- Cada camada tem uma contagem de controle definida antes de rodar.
- A camada 1 bate com uma fonte independente.
- Junções 1:1 preservaram a contagem.
- A soma dos segmentos bate com o total.
- Nenhuma validação foi feita olhando
LIMIT 10.
- Toda camada precisa de um número que você consiga conferir contra algo que já sabe.
Comentários e dúvidas
Inscreva-se grátis para comentar, tirar dúvidas, marcar seu progresso e emitir o certificado ao fim do curso.
Inscrever-se grátis com GoogleAinda não há comentários nesta aula.