Saldo diário de conta (INICIAL E FINAL)

DBA Geral (instalação, configuração do banco, scripts do Sql*Plus, shell scripts, batch scripts, etc...)
Responder
junior.tordoya
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 27 Ago 2012 8:19 pm

Prezados gostaria de uma ajuda para elaborar uma query onde possa retornar o saldo diário de varias contas bancárias. Possuo somente os lançamento de extrato ( na mesma tabela) conforme informações abaixo:
Data C.Conta Conta Valor Debito-Credito
01/01/2018 001 Conta A 10,00 C
01/01/2018 001 Conta A 100,00 C
01/01/2018 001 Conta A 20,00 D
01/01/2018 003 Conta C 50,00 C
01/01/2018 001 Conta A 10,00 D
02/02/2018 001 Conta A 10,00 C
02/02/2018 001 Conta A 90,00 C
02/02/2018 003 Conta C 70,00 C
03/02/2018 001 Conta A 5,00 D
03/02/2018 003 Conta C 15,00 D
03/02/2018 003 Conta C 7,00 D

preciso que retorne o seguinte:
Data C.Conta Conta Valor Tipo
01/01/2018 001 Conta A 0,00 Saldo Inicial
01/01/2018 001 Conta A 80,00 Saldo Final
01/01/2018 003 Conta C 0,00 Saldo Inicial
01/01/2018 003 Conta C 50,00 Saldo Final
02/01/2018 001 Conta A 80,00 Saldo Inicial
02/01/2018 001 Conta A 180,00 Saldo Final
02/01/2018 003 Conta C 50,00 Saldo Inicial
02/01/2018 003 Conta C 120,00 Saldo Final
03/01/2018 001 Conta A 180,00 Saldo Inicial
03/01/2018 001 Conta A 175,00 Saldo Final
03/01/2018 003 Conta C 120,00 Saldo Inicial
03/01/2018 003 Conta C 28,00 Saldo Final

obs.: Os saldo deverão ser apresentados em todos os dias.

Agradeço muito a ajuda
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Olá Jr,

acredito que a seguinte query te ajudará bastante.
Foi preciso fazer uso de funções analíticas e certos recursos para simular o saldo inicial e final.

Selecionar tudo

WITH TAB AS (
select '01/01/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 10.00 valor, 'C' tipo from dual union all
select '01/01/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 100.0 valor, 'C' tipo from dual union all
select '01/01/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 20.0 	valor, 'D' tipo from dual union all
select '01/01/2018' data_mov ,	'003' Cod_conta ,	'Conta C' conta	, 50.0 	valor, 'C' tipo from dual union all
select '01/01/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 10.00 valor, 'D' tipo from dual union all
select '02/02/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 10.0 	valor, 'C' tipo from dual union all
select '02/02/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 90.0 	valor, 'C' tipo from dual union all
select '02/02/2018' data_mov ,	'003' Cod_conta ,	'Conta C' conta	, 70.0 	valor, 'C' tipo from dual union all
select '03/02/2018' data_mov ,	'001' Cod_conta ,	'Conta A' conta	, 5.00 	valor, 'D' tipo from dual union all
select '03/02/2018' data_mov ,	'003' Cod_conta ,	'Conta C' conta	, 15.00 valor, 'D' tipo from dual union all
select '03/02/2018' data_mov ,	'003' Cod_conta ,	'Conta C' conta	, 7.00 	valor, 'D' tipo from dual)
, SALDOS AS (
SELECT 1 ID , 'SALDO INICIAL' DESCR FROM DUAL UNION ALL
SELECT 2 ID , 'SALDO FINAL' DESCR FROM DUAL
)
SELECT T.data_mov
     , T.Cod_conta
     , S.ID
     , S.DESCR
     , sum(decode(T.tipo,'C', T.VALOR , T.VALOR * -1)) mov
     , CASE WHEN S.ID = 1 THEN
              /* SALDO ACUM - MOV */
               sum(sum(decode(T.tipo,'C', T.VALOR , T.VALOR * -1))) over ( PARTITION BY T.Cod_conta,S.ID  ORDER BY T.data_mov, T.Cod_conta,S.ID) - sum(decode(T.tipo,'C', T.VALOR , T.VALOR * -1))
           WHEN S.ID = 2 THEN
             /* SALDO ACUM */
               sum(sum(decode(T.tipo,'C', T.VALOR , T.VALOR * -1))) over ( PARTITION BY T.Cod_conta,S.ID  ORDER BY T.data_mov, T.Cod_conta,S.ID)
       END VALOR
  FROM TAB T
     , SALDOS S
WHERE 1 = 1
GROUP BY T.data_mov
       , T.Cod_conta  
       , S.ID
       , S.DESCR       
ORDER BY T.data_mov
       , T.Cod_conta
     , S.ID
junior.tordoya
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 27 Ago 2012 8:19 pm

Daniel, bom dia!
Muito obrigado pela ajuda, a query funcionou corretamente, excelente.
Novamente muito obrigado ajuda.

Abraços,

Junior
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Legal que deu certo.
Só atentando que na minha query deixei o campo data como texto mesmo. Mas precisa ser DATA senão vai furar a solução.
junior.tordoya
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 5
Registrado em: Seg, 27 Ago 2012 8:19 pm

Daniel, boa tarde!
A query funcionou pois adaptei na tabela que contem o extrato e esta tem a data (em formato de data). Mas estou tentando fazer um ajuste na mesma para carregar dias que não estão registrados no extrato, e que contem saldo. A dificuldade que estou tendo é que o saldo do dia só é apresentado se teve movimentação no extrato, gostaria que apresentasse o saldo mesmo sem movimentação da tabela do extrato.

você poderia me ajudar nesse ajuste?

Abraços,
DanielNN
Moderador
Moderador
Mensagens: 641
Registrado em: Seg, 03 Set 2007 3:26 pm
Localização: Fortaleza - CE
att,

Daniel N.N.

Opa,
dá uma olhada neste tópico:

http://glufke.net/oracle/viewtopic.php? ... +by#p36620

É possível gerar uma query que retorne todos dias do período informado.
Aí será necessário fazer a junção com a query principal, esta até com outter join devido a não possuir todos dias.
Responder
  • Informação