Como obter saldo acumulado por linha no Postgres?

06/06/2011

0

Prezados,

Estou precisando calcular os saldos diários de um determinado período em um extrato de conta-corrente. Como obter essa informação a partir de consulta SQL?

Vejamos:

Tenho uma consulta com a estrutura:

data_lancamento
debito_no_dia
credito_no_dia
(credito_no_dia - debito_no_dia) as saldo_no_dia

Na tabela acima, existem lançamentos em ALGUNS dias do período e preciso que no resultado aparecam TODOS os dias. Isso eu resolvi usando um inner join com generate_series, então agora, tenho um conjunto de registros com todos os dias do perído desejado...

Preciso de ajuda sobre como calcular o saldo ACUMULADO dos dias anteriores em cada linha do conjunto de registros. O resultado desejado seria algo do tipo:

data_lancamento        debito_no_dia        credito_no_dia      saldo_no_dia       saldo_cumulado

01/06/2011                             100,00                    200,00                 100,00                     100,00
02/06/2011                              300,00                   100,00                -200,00                    -100,00
03/06/2011                                                                                                                       -100,00
04/06/2011                                                                                                                       -100,00
05/06/2011                                  0,00                   400,00                  400,00                     300,00     

Note que nos dias 03 e 04 não existe lançamentos na tabela, mas os dias foram criados pelo generate_series. Preciso saber como criar a coluna SALDO_ACUMULADO linha a linha que, em tese, é a soma do saldo_do_dia com o saldo_acumulado do dia anterior apresentado no recordset.                                                                                  

Esse formato é importante em meu aplicativo, porque, através dele consigo saber, por exemplo, em quantos e quais dias o saldo ficou negativo, possibilitando calcular o juro do cheque especial dia-a-dia e conferir com o valor cobrado pelo banco. Por isso preciso todos os dias e o saldo acumulado no final de cada dia, linha a linha.


Podem dar um exmplo de como implentar a solução na prática?


Grato,


Alexandre








Alexandre Thees

Alexandre Thees

Responder

Posts

07/06/2011

Jair N.

Buonasera Alex, segue abaixo um exemplo "meio que esquisito" mas dá pra entender.....
Acaso, se for uma questão de praticidade criar uma view para saldos em períodos....


         SELECT  cc_extrado.data_lancamento
              ,  my_periodo.data
    ,  COALESCE (cc_extrado.debito_no_dia , 0) AS debito_no_dia
    ,  COALESCE (cc_extrado.credito_no_dia, 0) AS credito_no_dia
 ,SUM (COALESCE (cc_extrado.credito_no_dia, 0) - COALESCE(cc_extrado.debito_no_dia , 0) ) AS saldo_no_dia
              , (SELECT SUM(my_extrado.credito_no_dia - my_extrado.debito_no_dia)
                   FROM  cc_extrado my_extrado
                  WHERE (my_extrado.data_lancamento <= my_periodo.data)) AS saldo_acumulado
           FROM  cc_extrado
     RIGHT JOIN (SELECT (MIN(cc_extrado.data_lancamento) + GENERATE_SERIES(0,
                  (CAST (MAX(cc_extrado.data_lancamento) - MIN(cc_extrado.data_lancamento) AS INT)),1)) AS data
                   FROM cc_extrado) AS my_periodo
             ON (my_periodo.data = cc_extrado.data_lancamento)
       GROUP BY  cc_extrado.data_lancamento
              ,  cc_extrado.debito_no_dia
              ,  cc_extrado.credito_no_dia
              ,  my_periodo.data
       ORDER BY  my_periodo.data;




Prezados,

Estou precisando calcular os saldos diários de um determinado período em um extrato de conta-corrente. Como obter essa informação a partir de consulta SQL?

Vejamos:

Tenho uma consulta com a estrutura:

data_lancamento
debito_no_dia
credito_no_dia
(credito_no_dia - debito_no_dia) as saldo_no_dia

Na tabela acima, existem lançamentos em ALGUNS dias do período e preciso que no resultado aparecam TODOS os dias. Isso eu resolvi usando um inner join com generate_series, então agora, tenho um conjunto de registros com todos os dias do perído desejado...

Preciso de ajuda sobre como calcular o saldo ACUMULADO dos dias anteriores em cada linha do conjunto de registros. O resultado desejado seria algo do tipo:

data_lancamento        debito_no_dia        credito_no_dia      saldo_no_dia       saldo_cumulado

01/06/2011                             100,00                    200,00                 100,00                     100,00
02/06/2011                              300,00                   100,00                -200,00                    -100,00
03/06/2011                                                                                                                       -100,00
04/06/2011                                                                                                                       -100,00
05/06/2011                                  0,00                   400,00                  400,00                     300,00     

Note que nos dias 03 e 04 não existe lançamentos na tabela, mas os dias foram criados pelo generate_series. Preciso saber como criar a coluna SALDO_ACUMULADO linha a linha que, em tese, é a soma do saldo_do_dia com o saldo_acumulado do dia anterior apresentado no recordset.                                                                                  

Esse formato é importante em meu aplicativo, porque, através dele consigo saber, por exemplo, em quantos e quais dias o saldo ficou negativo, possibilitando calcular o juro do cheque especial dia-a-dia e conferir com o valor cobrado pelo banco. Por isso preciso todos os dias e o saldo acumulado no final de cada dia, linha a linha.


Podem dar um exmplo de como implentar a solução na prática?


Grato,


Alexandre








Responder

05/07/2011

Emerson Nascimento

como você não publicou a estrutura da sua tabela, vou trabalhar com a seguinte estrutura:

data
descricao
valor
tipo (debito ou credito)


onde os dados devem aparecer assim:

data        descricao                  valor  debito_credito
----------  --------------------  ----------  --------------
01.06.2011  dep. conta corrente     1.200,00  C
01.06.2011  pagto. conta luz          165,00  D
01.06.2011  pagto. conta agua          54,76  D
01.06.2011  pagto. fatura             600,00  D
02.06.2011  pagto. fatura             175,00  D
02.06.2011  recbtos. diversos         325,00  C

baseado nisso, creio que a instrução a seguir deva trazer as informações que você precisa:

SELECT
  e.data,
  coalesce(sum(case when e.tipo='C' then e.valor else 0 end), 0) credito_no_dia,
  coalesce(sum(case when e.tipo='D' then e.valor else 0 end), 0) debito_no_dia,
  coalesce(sum(e.valor * (case when e.tipo='D' then -1 else 1 end)), 0) saldo_no_dia,
  (SELECT
     coalesce(sum(e2.valor * (case when e2.tipo='D' then -1 else 1 end)), 0)
   FROM
     extrato e2
   WHERE
     e2.data <= e.data) acumulado
FROM
  extrato e
WHERE
  e.data between '01.06.2011' and '30.06.2011'
GROUP BY
  e.data
ORDER BY
  e.data

faça a adaptação para o seu modelo de dados.

Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar