Relatórios
5 relatórios de gestão em SQL, executados ao vivo — exporte em PDF, CSV ou via API.
01. Funil de prospecção por segmento
JOINWHEREANDCOUNTAVG
Leads por nicho, quantos estão quentes e o score médio de oportunidade.
-- R1 — Funil de prospecção por segmento
-- Quantos leads existem por nicho, quantos estão quentes e o "score de feiura" médio.
-- Comandos: JOIN, WHERE, AND, COUNT, AVG, GROUP BY, ORDER BY.
SELECT s.nome AS segmento,
COUNT(*) AS total_leads,
COUNT(CASE WHEN l.temperatura IN ('QUENTE', 'SUPER_QUENTE') THEN 1 END) AS leads_quentes,
ROUND(AVG(l.score_feiura), 1) AS score_medio
FROM leads l
JOIN segmentos s ON s.id = l.segmento_id
WHERE l.ativo = 1 AND l.franquia = 0
GROUP BY s.id
ORDER BY total_leads DESC, score_medio DESC;| Segmento | Total leads | Leads quentes | Score medio |
|---|---|---|---|
| Odontologia | 2 | 2 | 71 |
| Agro | 2 | 1 | 60 |
| Construtora | 2 | 1 | 57.5 |
| Imobiliário | 2 | 1 | 57.5 |
| Bares e Eventos | 1 | 1 | 78 |
| Estética | 1 | 1 | 70 |
| Educação | 1 | 0 | 55 |
02. MRR — receita recorrente por plano
JOINWHERESUMCOUNT
Soma das mensalidades dos contratos ativos e projeção anual (ARR).
-- R2 — MRR (receita recorrente mensal) por plano
-- Soma do valor mensal dos contratos ativos e projeção anual, agrupado por plano.
-- Comandos: JOIN, WHERE, COUNT, SUM, GROUP BY, ORDER BY.
SELECT p.nome AS plano,
COUNT(c.id) AS contratos_ativos,
SUM(c.valor_mensal) AS mrr,
SUM(c.valor_mensal) * 12 AS arr_projetado
FROM contratos c
JOIN planos p ON p.id = c.plano_id
WHERE c.status = 'ATIVO'
GROUP BY p.id
ORDER BY mrr DESC;| Plano | Contratos ativos | Mrr | Arr projetado |
|---|---|---|---|
| Grow | 2 | R$ 8.100 | R$ 97.200 |
| Exclusive | 1 | R$ 7.490 | R$ 89.880 |
| Start | 2 | R$ 5.400 | R$ 64.800 |
03. Inadimplência
JOINWHEREANDORCOUNTSUM
Clientes com faturas vencidas em aberto: quantidade e total devido.
-- R3 — Inadimplência (faturas vencidas em aberto)
-- Clientes com faturas em aberto já vencidas: quantidade e total devido.
-- Comandos: JOIN (2x), WHERE, AND, OR, COUNT, SUM, MIN, GROUP BY, HAVING.
SELECT cl.nome AS cliente,
COUNT(f.id) AS faturas_vencidas,
SUM(f.valor) AS total_em_aberto,
MIN(f.vencimento) AS vencimento_mais_antigo
FROM faturas f
JOIN contratos c ON c.id = f.contrato_id
JOIN clientes cl ON cl.id = c.cliente_id
WHERE f.status = 'ABERTA'
AND (f.vencimento < date('now') OR f.competencia < strftime('%Y-%m', 'now'))
GROUP BY cl.id
HAVING total_em_aberto > 0
ORDER BY total_em_aberto DESC;| Cliente | Faturas vencidas | Total em aberto | Vencimento mais antigo |
|---|---|---|---|
| AgroInsumos Norte | 2 | R$ 8.400 | 12/05/2026 |
| Clínica OdontoVida | 2 | R$ 7.800 | 17/05/2026 |
| Construtora Horizonte | 1 | R$ 7.490 | 15/06/2026 |
| Imobiliária Raízes | 2 | R$ 5.000 | 19/05/2026 |
04. Extrato de caixa (realizado + previsto)
UNION ALLJOINWHERE
Une pagamentos recebidos e faturas previstas num único extrato.
-- R4 — Extrato de caixa: realizado + previsto
-- Une, num único extrato, o que já foi recebido (pagamentos) com o que ainda
-- está previsto (faturas em aberto). É o caso clássico de UNION ALL.
-- Comandos: UNION ALL, JOIN (3x), WHERE, ORDER BY.
SELECT pg.pago_em AS data,
'REALIZADO' AS tipo,
cl.nome AS cliente,
pg.valor AS valor
FROM pagamentos pg
JOIN faturas f ON f.id = pg.fatura_id
JOIN contratos c ON c.id = f.contrato_id
JOIN clientes cl ON cl.id = c.cliente_id
UNION ALL
SELECT f.vencimento AS data,
'PREVISTO' AS tipo,
cl.nome AS cliente,
f.valor AS valor
FROM faturas f
JOIN contratos c ON c.id = f.contrato_id
JOIN clientes cl ON cl.id = c.cliente_id
WHERE f.status = 'ABERTA'
ORDER BY data, tipo;| Data | Tipo | Cliente | Valor |
|---|---|---|---|
| 20/01/2026 | REALIZADO | Construtora Horizonte | R$ 7.490 |
| 15/02/2026 | REALIZADO | Clínica OdontoVida | R$ 3.900 |
| 16/02/2026 | REALIZADO | Construtora Horizonte | R$ 7.490 |
| 10/03/2026 | REALIZADO | AgroInsumos Norte | R$ 4.200 |
| 16/03/2026 | REALIZADO | Clínica OdontoVida | R$ 3.900 |
| 16/03/2026 | REALIZADO | Construtora Horizonte | R$ 7.490 |
| 14/04/2026 | REALIZADO | AgroInsumos Norte | R$ 4.200 |
| 15/04/2026 | REALIZADO | Clínica OdontoVida | R$ 3.900 |
| 15/04/2026 | REALIZADO | Imobiliária Raízes | R$ 2.500 |
| 16/04/2026 | REALIZADO | Construtora Horizonte | R$ 7.490 |
| 12/05/2026 | PREVISTO | AgroInsumos Norte | R$ 4.200 |
| 16/05/2026 | REALIZADO | Construtora Horizonte | R$ 7.490 |
| 17/05/2026 | PREVISTO | Clínica OdontoVida | R$ 3.900 |
| 19/05/2026 | PREVISTO | Imobiliária Raízes | R$ 2.500 |
| 12/06/2026 | PREVISTO | AgroInsumos Norte | R$ 4.200 |
| 15/06/2026 | PREVISTO | Construtora Horizonte | R$ 7.490 |
| 17/06/2026 | PREVISTO | Clínica OdontoVida | R$ 3.900 |
| 19/06/2026 | PREVISTO | Imobiliária Raízes | R$ 2.500 |
| 08/07/2026 | PREVISTO | Boutique Bella | R$ 2.900 |
05. Ranking de clientes por LTV
JOINLEFT JOINSUMCOUNT
Valor total já pago por cliente ativo, com número de contratos.
-- R5 — Ranking de clientes por LTV (valor total já pago)
-- Soma de tudo que cada cliente ativo já pagou, com número de contratos.
-- Usa LEFT JOIN para incluir clientes ativos mesmo sem pagamentos.
-- Comandos: JOIN (INNER + LEFT), WHERE, AND, COUNT(DISTINCT), SUM, GROUP BY, ORDER BY, LIMIT.
SELECT cl.nome AS cliente,
s.nome AS segmento,
COUNT(DISTINCT c.id) AS contratos,
COALESCE(SUM(pg.valor), 0) AS ltv
FROM clientes cl
JOIN segmentos s ON s.id = cl.segmento_id
LEFT JOIN contratos c ON c.cliente_id = cl.id
LEFT JOIN faturas f ON f.contrato_id = c.id
LEFT JOIN pagamentos pg ON pg.fatura_id = f.id
WHERE cl.status = 'ATIVO' AND s.ativo = 1
GROUP BY cl.id
ORDER BY ltv DESC
LIMIT 10;| Cliente | Segmento | Contratos | Ltv |
|---|---|---|---|
| Construtora Horizonte | Construtora | 1 | R$ 37.450 |
| Clínica OdontoVida | Odontologia | 1 | R$ 11.700 |
| AgroInsumos Norte | Agro | 1 | R$ 8.400 |
| Imobiliária Raízes | Imobiliário | 1 | R$ 2.500 |
| Boutique Bella | Estética | 1 | R$ 0 |
