rictom / cnpj-sqlite

Script em python para carregar os arquivos de cnpj com dados públicos da Receita Federal para o formato sqlite
MIT License
156 stars 48 forks source link

[Dúvida] Erro de sintaxe SQLITE3 #22

Closed gersonmachado closed 1 year ago

gersonmachado commented 1 year ago

Boa noite! Tudo bem?

Estou com dificuldades em concatenar umas tabelas de forma que não se dupliquem por causa do nome dos socios, então estou apelando para o GROUP_CONCAT().

Porém, da forma que estou fazendo no Python não é retornado um erro e fica em loop eterno. Pode tentar me ajudar?

Testes de queries funcionais:

 '''
    SELECT 
    socios.cnpj, 
    GROUP_CONCAT(socios.nome_socio) AS "SoCIOS"
    FROM socios
    GROUP BY socios.cnpj
    LIMIT 1;
'''

Dessa forma o nome dos sócios ficam em uma linha, impedindo duplicata.

  """
  SELECT *
  FROM estabelecimento
  INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
  LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
  LIMIT 5;
  """

Dessa forma, consigo unir 3 tabelas para gerar um DataFrame com Pandas. Porém, os nomes duplicam os resultados da consulta de acordo com a quantidade de nomes de sócios para a mesma chave.

Minhas tentativas de solução para realizar aquelas duas operações em uma query:

"""
SELECT 
estabelecimento.cnae_fiscal,
estabelecimento.nome_fantasia,
empresas.razao_social,
(SELECT GROUP_CONCAT(socios.nome_socio) FROM socios WHERE estabelecimento.cnpj_basico = socios.cnpj_basico) AS "Socios"
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
GROUP BY estabelecimento.cnpj_basico
LIMIT 4;
"""

"""
SELECT 
estabelecimento.cnae_fiscal,
estabelecimento.nome_fantasia,
empresas.razao_social,
(SELECT GROUP_CONCAT(socios.nome_socio) FROM socios) AS "Socios"
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
GROUP BY estabelecimento.cnpj_basico
LIMIT 4;
"""

"""
SELECT 
estabelecimento.cnae_fiscal,
estabelecimento.nome_fantasia,
empresas.razao_social,
GROUP_CONCAT(socios.nome_socio) AS "Socios"
FROM estabelecimento
INNER JOIN socios ON estabelecimento.cnpj_basico=socios.cnpj_basico
LEFT JOIN empresas ON estabelecimento.cnpj_basico=empresas.cnpj_basico
GROUP BY estabelecimento.cnpj_basico
LIMIT 4;
"""

Todas essas tentativas não me retornam dados nem erros. O python fica eternamente carregando/rodando e nada acontece.

rictom commented 1 year ago

Olá @gersonmachado

Eu sugiro o seguinte, ao invês de encadear no meio de outra consulta, primeiro gera uma tabela nova, como Create table socios_agrupado AS SELECT socios.cnpj, GROUP_CONCAT(socios.nome_socio) AS "SoCIOS" FROM socios GROUP BY socios.cnpj;

e depois usa essa tabela nova nas outras consultas. Eu diria que só para gerar essa tabela (se conseguir) vai levar um tempão, talvez horas. Ao invês de fazer por código em python, roda a sql no DBBrowser

gersonmachado commented 1 year ago

Obrigado! Facilitou bastante e nem levou muito tempo, cerca de 2min.