none
Dúvida sobre a melhor forma da construção de um select RRS feed

  • 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

    segunda-feira, 20 de fevereiro de 2017 12:05

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
    segunda-feira, 20 de fevereiro de 2017 16:03
  • Deleted
    • Marcado como Resposta carine.couto terça-feira, 21 de fevereiro de 2017 12:36
    segunda-feira, 20 de fevereiro de 2017 21:39

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

    segunda-feira, 20 de fevereiro de 2017 12:54
  • 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
    segunda-feira, 20 de fevereiro de 2017 13:03
  • 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

    segunda-feira, 20 de fevereiro de 2017 13:11
  • Os dados são exclusivos...

    Acho que no momento minha dificuldade está em montar justamente a parte que mostra a soma de créditos menos débitos  "movimentação".

    Tem como me ajudar  a montar essa estrutura no select  ?

    segunda-feira, 20 de fevereiro de 2017 14:54
  • 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
    segunda-feira, 20 de fevereiro de 2017 16:03
  • 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

    segunda-feira, 20 de fevereiro de 2017 20:05
  • Deleted
    • Marcado como Resposta carine.couto terça-feira, 21 de fevereiro de 2017 12:36
    segunda-feira, 20 de fevereiro de 2017 21:39
  • Muito Obrigada por sua atenção!

    Finalmente problema resolvido!

    terça-feira, 21 de fevereiro de 2017 12:37
  • Muito Obrigada!
    terça-feira, 21 de fevereiro de 2017 12:38