Ir para conteúdo

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Gustavo_RJ

Dúvida Query Running totais saldos baixas parciais

Recommended Posts

Prezados, bom dia. Estou montando uma query para um relatório sobre baixas de títulos e seus Históricos de baixas.

Tenho uma tabela de títulos e outra que registra as baixas parciais destes títulos até que o título esteja totalmente baixado.

Preciso apresentar o saldo dos títulos em uma determinada data (saldo sendo composto através de memória de cálculo contendo todas as baixas anteriores) e o saldo após a baixa nesta data. 

O título pode ter várias baixas parciais e elas ficam registradas na tabela de baixas.


Eu montei a Query para análise de UM título, consigo compor a memória de calculo, e o saldo atual dele, mas queria saber se é possível fazer o mesmo para os diversos títulos da tabela.

As tabelas envolvidas são mais ou menos assim:

 

Tab_Titulo (registro dos títulos)
Numero_titulo    Prefixo    Parcela    Cliente  Valor_itulo   Data_Vencimento
1012                                                            100      4000                  20170814
1013                                                            150      5000                  20170818
1020                                                            099      1500                  20170813

 

 

Tab_Baixa (registro das baixas dos títulos)
Numero_titulo    Prefixo    Parcela    Cliente        Valor_Baixa      Data_Baixa
1012                                                        100                        500          20170814
1012                                                        100                       1.05          20170815
1012                                                        100                          70          20170815
1012                                                        100                        650          20170815
1012                                                        100                        150          20170816
1013                                                        150                        200          20170810
1013                                                        150                        500          20170814
1013                                                        150                        500          20170815
1020                                                        099                        500          20170816

 

Olhando para o dia 16/08/2016 o título 1012 inicia o dia tendo um saldo de 2778.95 (400-todas as baixas anteriores) e ao ser efetuada a baixa do dia 16/05, o saldo vai para 2628.95.
Consigo montar corretamente esta situação para este título mas preciso mostrar também o título 1020, pois no dia 16/08 ele também teve uma baixa e ficaria com saldo inicial de 1500 e saldo final de 1000.

A dúvida é justamente esta, como apresentar não apenas um título, mas todos os títulos que tiveram baixa na data especificada apresentando também seus saldos iniciais daquele dia?

Estou anexando uma planilha para melhor visualização do resultado e do histórico de baixas do título 1012, caso achem que aqui não ficou bem claro.

A query que estou usando está abaixo, agradeço toda ajuda

 

SELECT  TAB_BAIXA_PREFIXO AS [PREFIXO], 
        TAB_BAIXA_NUMERO  AS [NUMERO], 
        TAB_BAIXA_PARCELA AS [PARCELA],  
        TAB_BAIXA_CLIENTE AS [CODCLI], 
        Tab_Cliente_NOME  AS [DESCCLI], 
        Tab_Titulo_VENCTOREAL AS [VENCIMENTO], 
        TAB_BAIXA_DATA        AS [DT BAIXA], 
    Tab_Titulo_VALOR      AS [VL_ORIGINAL], 
    Tab_Titulo_VALOR - (SELECT ISNULL(SUM(TAB_BAIXA_VALOR),'0')  FROM TAB_BAIXA WHERE TAB_BAIXA_NUMERO = '1012'  AND TAB_BAIXA_DATA < '20170816' AND TAB_BAIXA_CLIENTE = '100')  AS [SALDO_BAIXAS_ANTERIORRES],

    TAB_BAIXA_VALOR AS [VALOR_BAIXA_NA_DATA], 

    Tab_Titulo_VALOR  - (SELECT ISNULL(SUM(TAB_BAIXA_VALOR),'0') FROM TAB_BAIXA  WHERE TAB_BAIXA_NUMERO = '1012'  AND TAB_BAIXA_DATA < '20170816' AND TAB_BAIXA_CLIENTE = '100') - 

    SUM (TAB_BAIXA_VALOR) OVER(PARTITION by TAB_BAIXA_NUMERO ORDER BY Tab_Titulo_VALOR ROWS UNBOUNDED PRECEDING) AS SALDO_ATUAL, TAB_BAIXA_HISTOR AS [HISTORICO BAIXA DO DIA]  


FROM       TAB_BAIXA   

INNER JOIN Tab_Titulo   
ON   
Tab_Titulo.PREFIXO      = TAB_BAIXA.TAB_BAIXA_PREFIXO AND 
Tab_Titulo.NUM             = TAB_BAIXA.TAB_BAIXA_NUMERO  AND 
Tab_Titulo.PARCELA     = TAB_BAIXA.TAB_BAIXA_PARCELA AND  
Tab_Titulo.CLIENTE      = TAB_BAIXA.TAB_BAIXA_CLIENTE AND 
Tab_Titulo.LOJA            = TAB_BAIXA.TAB_BAIXA_LOJA         

INNER JOIN Tab_Cliente
ON  
Tab_Titulo_CLIENTE = Tab_Cliente_COD AND 
Tab_Titulo_FILIAL     = Tab_Cliente_FILIAL       

WHERE                                
TAB_BAIXA_DATA = '20170816' AND  --- Data da Baixa que estamos analisando o título
 AND Tab_Titulo_NUM = ('1012')

Exemplo Resultado.xlsx

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Gustavo,

Eu criei umas tabelas temporárias de teste aqui com menos colunas para testar e aqui funcionou assim (vou colocar o script inteiro de criação de tabelas, insert e select):

 

CREATE TABLE ##tableTitulo (
    NumeroTitulo int,
    Cliente int,
    ValorTitulo decimal(10,2),
    DataVencimento Datetime
    );

CREATE TABLE ##tableBaixa (
    NumeroTitulo int,
    Cliente int,
    ValorBaixa decimal(10,2),
    DataBaixa Datetime
    );

	
	Insert into ##tableTitulo (NumeroTitulo, Cliente, ValorTitulo, DataVencimento) values (1012, 100, 4000, '2017-08-14')
	Insert into ##tableTitulo (NumeroTitulo, Cliente, ValorTitulo, DataVencimento) values (1013, 150, 5000, '2017-08-18')
	Insert into ##tableTitulo (NumeroTitulo, Cliente, ValorTitulo, DataVencimento) values (1020, 099, 1500, '2017-08-13')

	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1012, 100, 500, '2017-08-14')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1012, 100, 1.05, '2017-08-15')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1012, 100,   70, '2017-08-15')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1012, 100, 650, '2017-08-15')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1012, 100, 150, '2017-08-16')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1013, 150, 200, '2017-08-10')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1013, 150, 500, '2017-08-14')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1013, 150, 500, '2017-08-15')
	Insert into ##tableBaixa (NumeroTitulo, Cliente, ValorBaixa, DataBaixa) values (1020, 099, 500, '2017-08-16')
	


 SELECT  
		 B.Cliente,
		 B.NumeroTitulo as Título,
		 B.DataVencimento as Vencimento,
		 B.ValorTitulo as ValorOriginal,
		 Sum(case when A.DataBaixa = A.DataBaixa then A.ValorBaixa else 0 end) over(partition by A.NumeroTitulo) as [BaixaDeHoje],
		 (SELECT ISNULL(SUM(AAA.ValorBaixa),'0')  FROM ##tableBaixa as AAA  WHERE AAA.NumeroTitulo = A.NumeroTitulo  AND AAA.DataBaixa < A.DataBaixa  AND AAA.Cliente = A.Cliente) as [SALDO_BAIXAS_ANTERIORES],
		 (SELECT B.ValorTitulo - ISNULL(SUM(TAB_BAIXA.ValorBaixa),'0')  FROM ##tableBaixa as TAB_BAIXA  WHERE TAB_BAIXA.NumeroTitulo = A.NumeroTitulo  AND TAB_BAIXA.DataBaixa <= A.DataBaixa  AND TAB_BAIXA.Cliente = A.Cliente) as [SaldoAtual]

FROM       ##tableBaixa as A   
INNER JOIN ##tableTitulo as B   
ON   A.NumeroTitulo = B.NumeroTitulo

WHERE A.DataBaixa = '2017-08-16'

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde, 

 

prezado Lumiere sua dica foi certeira. resolveu a questão.

 

Peço desculpas por só agora responder, eu não estava acessando o fórum e esqueci de dar o feedback, mas obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.