Usuário com melhor resposta
Dúvida sobre a melhor forma da construção de um select

Pergunta
-
Bom dia!
Estou fazendo uma view que tem o objetivo final montar um comparativo da contabilidade com o financeiro.
Por enquanto estou montando a estrutura apenas da contabilidade...
Tenho a seguinte estrutura da tabela Contabil:
Data | conta debito | conta credito | Valor |
20160111 | 12346789 | 213450389 | 100,00 |
20160112 | 99999999 | 888888888 | 200,00 |
20160111 | 213450389 | 7777777 | 300,00 |
20160113 | 213450389 | 666666666 | 700,00 |
20160114 |12346789 | 213450389 | 500,00 |
Tenho que montar a seguinte estrutura:
Tipo | tipo_conta | Data | Conta do fornecedor | conta debito | conta credito | Valor | movimentação |
Contabil | DEBITO | 20160111 | 213450389 | 12346789 | 213450389 | 100,00 |
Contabil | CREDITO | 20160111 | 213450389 |213450389 | 7777777 | 300,00 |
Contabil | CREDITO |20160113 | 213450389 |213450389 | 666666666 | 700,00 |
Contabil | DEBITO | 20160114 | 213450389 | 12346789 | 213450389 | 500,00 |
Essa estrutura estou montando através do UNION ALL
1 ) Gostaria de saber se essa seria a melhor forma de montar essa estrutura, sendo que como trabalhamos com o ERP que para cada empresa cria uma estrutura de tabela.
2 ) A coluna movimentação é dada pela soma total dos credito - (menos) a soma geral dos Débitos, como faria isso?
Estou montando a seguinte estrutura:
SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL' AS TIPO, 'DEBITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2010 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_DEBITO WHERE C.CT2_DATA BETWEEN '20161101' AND '20161130' AND C.CT2_DEBITO= '210100020'--'210100017' AND C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL'AS TIPO, 'CREDITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2010 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_CREDIT WHERE C.CT2_DATA BETWEEN '20161101' AND '20161130' AND C.CT2_CREDIT= '210100020'--'210100017' AND C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*'
Obrigada pela atenção
Respostas
-
Vamos supor que sua View seja criada conforme abaixo:
SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL' AS TIPO, 'DEBITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2010 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_DEBITO WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL'AS TIPO, 'CREDITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2010 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_CREDIT WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL' AS TIPO, 'DEBITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2020 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_DEBITO WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL'AS TIPO, 'CREDITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2020 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_CREDIT WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*'
Você pode utilizar o seguinte select para criar o totalizador:
SELECT SUM(CASE WHEN CT2_CREDIT='210100020' THEN VALOR WHEN CT2_DEBITO = '210100020' THEN VALOR*-1 ELSE 0 END) as total FROM SUA_VIEW WHERE CT2_DATA BETWEEN '20161101' AND '20161130' AND (CT2_CREDIT = '210100020' OR CT2_DEBITO = '210100020')
Não cheguei a testar, mas acredito que esteja funcional.
Qualquer problema posta ai!
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Marcado como Resposta carine.couto terça-feira, 21 de fevereiro de 2017 12:36
-
Deleted
- Marcado como Resposta carine.couto terça-feira, 21 de fevereiro de 2017 12:36
Todas as Respostas
-
Bom dia Carine tudo bom?
Essa consulta você irá exibir em um relatório do Protheus ou outra ferramenta externa?
A forma com o UNION está correta, porém existem também outras abordagens.
Você só precisa de um totalizador da movimentação da conta informada, é isso?
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
-
Será exibida em outra ferramenta.
O que me deixa preocupada em relação ao union all e as tabelas do protheus é que sabemos que para cada empresa ele cria uma estrutura de tabela.
No me caso ai eu ainda estou montando a primeira empresa, e temos 4 rs ... estão essa estrutura vai ficar um pouco grandee
Sim. Eu preciso que na coluna movimentação ele pegue e some os valores do credito do fornecedor (-) o total de debito do fornecedor.
- Editado carine.couto segunda-feira, 20 de fevereiro de 2017 13:05
-
Sim, a estrutura ficará grande mesmo.
Mas sua tabela CT2 é exclusiva por empresa? não existe uma consolidação?
Se tiver a consolidação você consegue ver a empresa de origem na coluna CT2_EMPORI, CT2_FILORI.
Qual a ferramenta que será exibida a informação? Acredito que dependendo da ferramenta fica mais fácil fazer o totalizador lá do que na sua consulta (visto que ela está sendo gerada de forma analítica).
Uma outra possibilidade seria realizar 2 consultas na view diretamente na sua ferramenta de exibição, uma para os dados analíticos e outra para o totalizador.
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Sugerido como Resposta Junior Galvão - MVPMVP quarta-feira, 22 de fevereiro de 2017 18:30
-
-
Vamos supor que sua View seja criada conforme abaixo:
SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL' AS TIPO, 'DEBITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2010 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_DEBITO WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL'AS TIPO, 'CREDITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2010 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_CREDIT WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL' AS TIPO, 'DEBITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2020 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_DEBITO WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*' UNION ALL SELECT '01' EMPRESA, C.CT2_FILIAL, 'CONTABIL'AS TIPO, 'CREDITO' AS DESC_TIPO_CONTA, C.CT2_DATA, F.A2_CONTA CONTA_FORNECEDOR, C.CT2_CREDIT, C.CT2_DEBITO, C.CT2_VALOR VALOR, C.CT2_HIST HIST FROM dadosadv10.dbo.CT2020 C INNER JOIN dadosadv10.dbo.SA2010 F ON F.A2_CONTA = C.CT2_CREDIT WHERE C.CT2_TPSALD = 1 AND C.D_E_L_E_T_ <> '*'
Você pode utilizar o seguinte select para criar o totalizador:
SELECT SUM(CASE WHEN CT2_CREDIT='210100020' THEN VALOR WHEN CT2_DEBITO = '210100020' THEN VALOR*-1 ELSE 0 END) as total FROM SUA_VIEW WHERE CT2_DATA BETWEEN '20161101' AND '20161130' AND (CT2_CREDIT = '210100020' OR CT2_DEBITO = '210100020')
Não cheguei a testar, mas acredito que esteja funcional.
Qualquer problema posta ai!
"A vida é um paraíso, mas os homens não o sabem e não se preocupam em sabê-lo." Fiodor Dostoievski
- Marcado como Resposta carine.couto terça-feira, 21 de fevereiro de 2017 12:36
-
Ainda não consegui montar a estrutura..
Por que eu queria deixar dinâmico, sem prender os valores do período e da conta do fornecedor... :(Criei uma view que me mostre os valores de Debito apenas e outra que mostra os valores de credito e mesmo assim estou burrando aqui, me batendo e ainda não cheguei ao resultado...
SELECT L.CT2_EMPORI, L.ContaContabil, SUM (L.Valor) AS CREDIT,
(SELECT SUM (Valor) vw_lanc_Debito WHERE L.CT2_EMPORI = CT2_EMPORI
AND ContaContabil = L.ContaContabil
AND SUBSTRING(DATA, 1,6) LIKE SUBSTRING('%L.DATA%', 1,6)
AND CT2_TPSALD = 1 ) AS DEBITO
FROM vw_lanc_Credito L
WHERE L.Data BETWEEN '20161101' AND '20161130'
AND L.ContaContabil = '210100020'
AND L.CT2_TPSALD = 1
GROUP BY L.CT2_EMPORI, L.ContaContabil,L.DATA, L.CT2_TPSALD, Valor -
Deleted
- Marcado como Resposta carine.couto terça-feira, 21 de fevereiro de 2017 12:36
-
-