Prefeitura de Ipatinga

Documentação Técnica · RFB × Ipatinga
Cruzamentos & JOINs

Como as tabelas se conectam

Três relacionamentos fundamentais. Entender cada um evita perda de dados e resultados errados.

1ipatinga → estabelecimentos

CONCEITOcruzamento principal

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.

ipatinga.cpfcnpj
"12345678000195"
├ base: 12345678├ ordem: 0001└ dv: 95
🔗LEFT JOIN
estabelecimentos
cnpj_base = LEFT(cpfcnpj, 8)cnpj_ordem = SUBSTRING(cpfcnpj, 9, 4)cnpj_dv = RIGHT(cpfcnpj, 2)
-- 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'
Por que LEFT JOIN?

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

CONCEITOpara obter natureza jurídica e porte

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.

Zero perda de dados

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_base

3O 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

1

Comece por ipatinga

É a base de referência. Filtre por situacao = 'Ativo' pra trabalhar com as 14.276 empresas ativas.

2

LEFT JOIN com estabelecimentos

Usa os três campos do CNPJ: LEFT(cpfcnpj,8), SUBSTRING(cpfcnpj,9,4), RIGHT(cpfcnpj,2).

3

JOIN com empresas

Pra trazer natureza_juridica, porte e razao_social.

4

Compare os campos

Situação, endereço, bairro, CEP — compare ipatinga.campo com estabelecimentos.campo pra achar divergências.