Usuário com melhor resposta
Consulta para retornar qtde repetida em outra tabela

Pergunta
-
Pessoal, tudo certo?
Estou com uma dúvida para montar uma consulta.
é o seguinte:
Tenho 2 tabelas.. tabela1 e tabela2.
Ambas as tabelas eu tenho varias informações, porém, alguns campos se repetem nas tabelas...como cnpj e operacao.
o que preciso fazer:
fazer um join da tabela 1 e tabela 2 com o campo (operacao)...e algumas condições WHERE, onde precisam ser listados todos os cnpjs de um período (1mes x... por exemplo jan16) (nao importa se tem cnpj repetido) listar todos...
Até ai tudo bem.
o problema é, que preciso depois contar dos CNPJ que aparecem na consulta, quantas vezes o mesmo cnpj aparece em meses anteriores... ou seja...
quantas vezes o cnpj que apareceu em jan16 apareceu tb em meses anteriores dez15, nov15, out15....... jan08
conseguirem me ajudar?
Valeu.. abs,
- Editado Ro_flash quinta-feira, 11 de fevereiro de 2016 22:32
Respostas
-
Você vai ter que fazer uma subquery. Entendo que Jan16 é uma coluna do tipo DATE certo? Bem, digamos que você tem isso:
- Tabela1 (Operacao, CNPJ, OUTROCAMPO, DATA) * etc
- Tabela2 (Operacao, CNPJ, MAISOUTROCAMPO) * não entendi pq vc tem CNPJ nas 2 mas tudo bem. E é pra contar o CNPJ repetido da tabela1 ou da 2? Ou ambas?
Seu SELECT era algo assim certo?
SELECT tabela1.operacao AS 't1_op', tabela1.cnpj AS 't1_cnpj', tabela1.data AS 't1_data', tabela1.outrocampo AS 't1_outro', tabela2.operacao AS 't2_op', tabela2.cnpj AS 't2_cnpj', tabela2.maisoutrocampo AS 't2_outro' FROM tabela1 LEFT OUTER JOIN tabela2 ON tabela1.operacao = tabela2.operacao WHERE tabela1.outrocampo = 1
Bem, se você der COUNT(CNPJ) você terá todos os CNPJs contatos no SELECT inteiro. Para você fazer o ANTERIOR a linha mostrada, seria:
SELECT t1.operacao AS 't1_op', t1.cnpj AS 't1_cnpj', t1.data AS 't1_data', t1.outrocampo AS 't1_outro', tabela2.operacao AS 't2_op', tabela2.cnpj AS 't2_cnpj', tabela2.maisoutrocampo AS 't2_outro', (SELECT COUNT(pre_1.cnpj) FROM tabela1 AS 'pre_1' WHERE pre_1.cnpj = t1.cnpj AND pre_1.data < t1.data) AS 't1_cnpj_cont' FROM tabela1 AS t1 LEFT OUTER JOIN tabela2 ON tabela1.operacao = tabela2.operacao WHERE tabela1.outrocampo = 1
Note que atribui nomes as tabelas (argumento "AS") para que você possa comparar a mesma tabela (tabela1) entre a query principal e a subquery sem problemas de sintaxe ou confusões de valores. Assim, a subquery tem um WHERE que selecionará apenas datas anteriores a data da linha atual da query principal.
- Sugerido como Resposta SammuelMiranda sexta-feira, 12 de fevereiro de 2016 12:24
- Editado SammuelMiranda sexta-feira, 12 de fevereiro de 2016 12:25 espaços no texto
- Marcado como Resposta Marcos SJ sexta-feira, 12 de fevereiro de 2016 17:46
Todas as Respostas
-
Olá Ro_flash
Crie tabelas temporárias, por exemplo: CREATE TABLE #ANTERIORES... ou se for o caso ##ANTERIORES (ver variáveis locais ou globais) e uma ATUAIS (exemplo apenas).
A estrutura é a mesma de criação de uma tabela física, porém estas estarão disponíveis enquanto durar sua sessão ou até que você a drop do sistema.
Então de posse desta informação, faça uma consulta, primeiramente, com todas as incidências do cnpj durante os meses que se passaram (tabela1). Depois, faça a consulta que vc está fazendo mesmo(tabela2). Depois faça uma consulta com o join, utilizando as duas.
Luiz Fernando Lima - MCTS SQL Server - Microsoft Partner
-
Fala Luiz.
Obrigado pela resposta.
então, tentei criar uma tabela temp com os cnpj de jan16. usando a funçao INTO #tabela1
mas depois, nao consigo usar essa tabela temp #tabela1 como fonte da dados para contar quantas vezes o cnpj se repete em outros meses.
voce conseguiria fazer um select para eu ver como ficaria? usando como exemplo tabela1 tabela2 e bla bla...?
Obrigado mais uma vez.
-
-
-
-
-
Você vai ter que fazer uma subquery. Entendo que Jan16 é uma coluna do tipo DATE certo? Bem, digamos que você tem isso:
- Tabela1 (Operacao, CNPJ, OUTROCAMPO, DATA) * etc
- Tabela2 (Operacao, CNPJ, MAISOUTROCAMPO) * não entendi pq vc tem CNPJ nas 2 mas tudo bem. E é pra contar o CNPJ repetido da tabela1 ou da 2? Ou ambas?
Seu SELECT era algo assim certo?
SELECT tabela1.operacao AS 't1_op', tabela1.cnpj AS 't1_cnpj', tabela1.data AS 't1_data', tabela1.outrocampo AS 't1_outro', tabela2.operacao AS 't2_op', tabela2.cnpj AS 't2_cnpj', tabela2.maisoutrocampo AS 't2_outro' FROM tabela1 LEFT OUTER JOIN tabela2 ON tabela1.operacao = tabela2.operacao WHERE tabela1.outrocampo = 1
Bem, se você der COUNT(CNPJ) você terá todos os CNPJs contatos no SELECT inteiro. Para você fazer o ANTERIOR a linha mostrada, seria:
SELECT t1.operacao AS 't1_op', t1.cnpj AS 't1_cnpj', t1.data AS 't1_data', t1.outrocampo AS 't1_outro', tabela2.operacao AS 't2_op', tabela2.cnpj AS 't2_cnpj', tabela2.maisoutrocampo AS 't2_outro', (SELECT COUNT(pre_1.cnpj) FROM tabela1 AS 'pre_1' WHERE pre_1.cnpj = t1.cnpj AND pre_1.data < t1.data) AS 't1_cnpj_cont' FROM tabela1 AS t1 LEFT OUTER JOIN tabela2 ON tabela1.operacao = tabela2.operacao WHERE tabela1.outrocampo = 1
Note que atribui nomes as tabelas (argumento "AS") para que você possa comparar a mesma tabela (tabela1) entre a query principal e a subquery sem problemas de sintaxe ou confusões de valores. Assim, a subquery tem um WHERE que selecionará apenas datas anteriores a data da linha atual da query principal.
- Sugerido como Resposta SammuelMiranda sexta-feira, 12 de fevereiro de 2016 12:24
- Editado SammuelMiranda sexta-feira, 12 de fevereiro de 2016 12:25 espaços no texto
- Marcado como Resposta Marcos SJ sexta-feira, 12 de fevereiro de 2016 17:46