BanVic Clientes — Como foi feito (explicado fácil)
Pensa numa turma de 998 pessoas. Antes de tomar qualquer decisão (vender mais cartão, oferecer crédito), tem que saber quem são. Aqui usei SQL pra construir o "RG da carteira": idade, geografia, saldo. Idade média: 51,8 anos · 100% PF.
O que é isso, em uma frase?
É um conjunto de queries SQL que respondem 4 perguntas básicas sobre a base do BanVic: quantos? quais idades? onde moram? quanto tem em saldo?. Saída pronta pra alimentar o Power BI sem retrabalho.
Por que importa? "Conhecer o cliente" é o pilar 1 do marketing bancário. Sem saber a idade média, ninguém pensa em previdência. Sem saber a distribuição geográfica, não dá pra abrir agência onde precisa.
4 perguntas, 4 queries
1 · Métricas gerais com FILTER (WHERE...). Em vez de fazer 3 queries pra contar total, PF e PJ, uso o operador FILTER — 1 query só, mais limpa.
SELECT
COUNT(*) AS total,
COUNT(*) FILTER (WHERE tipo_cliente = 'PF') AS pf,
COUNT(*) FILTER (WHERE tipo_cliente = 'PJ') AS pj,
ROUND(AVG(EXTRACT(YEAR FROM age(data_nascimento)))::numeric, 1) AS idade_media
FROM stg_banvic.clientes;
-- 998 | 998 | 0 | 51.8
2 · Faixa etária com CASE. Idade contínua não vira insight; faixas viram. Agrupo em <30, 30-44, 45-59, 60+.
SELECT
CASE
WHEN EXTRACT(YEAR FROM age(data_nascimento)) < 30 THEN 'a) <30'
WHEN EXTRACT(YEAR FROM age(data_nascimento)) < 45 THEN 'b) 30-44'
WHEN EXTRACT(YEAR FROM age(data_nascimento)) < 60 THEN 'c) 45-59'
ELSE 'd) 60+'
END AS faixa,
COUNT(*)
FROM stg_banvic.clientes
GROUP BY 1 ORDER BY 1;
O prefixo a), b)... é uma manha pra forçar a ordem alfabética = ordem natural da idade. Sem isso o GROUP BY ordenaria errado.
3 · Saldo por cliente via JOIN. Cliente é uma tabela, conta é outra. Junto e somo. Aparece a curva clássica: poucos clientes concentram muito.
SELECT
c.cod_cliente,
c.primeiro_nome || ' ' || c.ultimo_nome AS nome,
SUM(ct.saldo_total) AS saldo_total,
COUNT(ct.num_conta) AS qtd_contas
FROM stg_banvic.clientes c
JOIN stg_banvic.contas ct ON ct.cod_cliente = c.cod_cliente
GROUP BY c.cod_cliente, nome
ORDER BY saldo_total DESC
LIMIT 10;
4 · Resultado pronto pro BI. Cada query vira uma view. O Power BI consulta direto, sem refazer transformações na camada de visualização.
Distribuição por faixa etária
Em uma linha: o que esse projeto ensina
Que SQL bem escrito reduz o trabalho do BI. Se o staging já entrega a faixa etária pronta, o dashboard só plota — rápido, consistente e sem erros de cálculo entre relatórios.
Coisas técnicas que apareceram aqui: COUNT(*) FILTER (WHERE...), EXTRACT(YEAR FROM age(...)), CASE com prefixo alfabético, JOIN + GROUP BY em 2 tabelas.