Como as tabelas se conectam
Três relacionamentos fundamentais. Entender cada um evita perda de dados e resultados errados.
1ipatinga → estabelecimentos
Este é o cruzamento central do dashboard. Serve pra comparar o que o município tem com o que a Receita Federal registra.
A chave de ligação é o CNPJ. Mas Ipatinga guarda o CNPJ completo (14 dígitos em cpfcnpj), enquanto estabelecimentos divide em 3 campos: cnpj_base + cnpj_ordem + cnpj_dv.
-- Cruzar Ipatinga com Estabelecimentos
SELECT
i.cpfcnpj,
i.situacao AS sit_ipatinga,
e.situacao AS sit_receita,
i.logradouro AS end_ipatinga,
e.logradouro AS end_receita
FROM ipatinga i
LEFT JOIN estabelecimentos e
ON LEFT(i.cpfcnpj, 8) = e.cnpj_base
AND SUBSTRING(i.cpfcnpj, 9, 4) = e.cnpj_ordem
AND RIGHT(i.cpfcnpj, 2) = e.cnpj_dv
WHERE i.situacao = 'Ativo'Porque queremos manter as empresas de Ipatinga mesmo quando não existem na Receita Federal — essas são as que precisam de atenção.
2estabelecimentos → empresas
Quando você precisa de natureza_juridica (saber se a empresa é MEI, Ltda, SA...) ou porte, precisa trazer da tabela empresas.
A chave é simples: estabelecimentos.cnpj_base = empresas.cnpj_base.
Todos os 93 milhões de estabelecimentos têm correspondência em empresas. Pode usar JOIN normal sem medo de perder registros.
-- Buscar estabelecimentos com natureza jurídica
SELECT
est.cnpj_base || est.cnpj_ordem || est.cnpj_dv AS cnpj,
est.situacao,
est.cidade,
emp.natureza_juridica,
emp.porte,
emp.razao_social
FROM estabelecimentos est
JOIN empresas emp ON est.cnpj_base = emp.cnpj_base3O JOIN completo (3 tabelas)
-- Query completa: Ipatinga × RFB com tipo de empresa
SELECT
i.cpfcnpj,
i.situacao AS sit_ipatinga,
e.situacao AS sit_receita,
emp.natureza_juridica,
CASE
WHEN emp.natureza_juridica = '2135' THEN 'MEI'
WHEN emp.natureza_juridica = '2062' THEN 'Ltda'
WHEN emp.natureza_juridica = '2054' THEN 'SA'
ELSE 'Outro'
END AS tipo_empresa,
emp.razao_social,
i.logradouro AS end_ipatinga,
e.logradouro AS end_receita
FROM ipatinga i
LEFT JOIN estabelecimentos e
ON LEFT(i.cpfcnpj, 8) = e.cnpj_base
AND SUBSTRING(i.cpfcnpj, 9, 4) = e.cnpj_ordem
AND RIGHT(i.cpfcnpj, 2) = e.cnpj_dv
LEFT JOIN empresas emp ON e.cnpj_base = emp.cnpj_base
WHERE i.situacao = 'Ativo'Passo a passo do cruzamento
Comece por ipatinga
É a base de referência. Filtre por situacao = 'Ativo' pra trabalhar com as 14.276 empresas ativas.
LEFT JOIN com estabelecimentos
Usa os três campos do CNPJ: LEFT(cpfcnpj,8), SUBSTRING(cpfcnpj,9,4), RIGHT(cpfcnpj,2).
JOIN com empresas
Pra trazer natureza_juridica, porte e razao_social.
Compare os campos
Situação, endereço, bairro, CEP — compare ipatinga.campo com estabelecimentos.campo pra achar divergências.