PostgreSQL: Cálculo de Saldo Acumulado a partir de Transações Financeiras

Este script SQL realiza cálculos de saldo acumulado com base em transações financeiras armazenadas na tabela "iugu_financial." `Principais partes do script:

  1. WITH data AS (...): Esta é uma cláusula comum que cria uma tabela temporária chamada "data" usando uma consulta CTE (Common Table Expression). A consulta seleciona informações da tabela "iugu_financial" e realiza as seguintes operações:

    • Classifica as transações financeiras em "credit" (crédito) e "debit" (débito).
    • Calcula o saldo acumulado (sldacum) com base nas transações financeiras. Os créditos são positivos e os débitos são negativos no cálculo do saldo acumulado.
    • Agrupa as transações financeiras pelo ID da transação.
  2. SELECT fin_id, fin_entry_date, credit, debit, sum(sldacum) OVER (ORDER BY fin_id ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) FROM data: Esta é a consulta final que seleciona os resultados do cálculo. Ele recupera o ID da transação, a data de entrada, os valores de crédito e débito e calcula o saldo acumulado. O saldo acumulado é calculado usando a função de janela SUM que soma os valores de "sldacum" para todas as linhas desde o início até a linha atual, ordenadas pelo ID da transação em ordem crescente.

A aplicabilidade deste script é calcular o saldo acumulado com base em transações financeiras armazenadas na tabela "iugu_financial" para um intervalo de datas específico (no caso, '2019-11-10' a '2019-11-10'). O saldo acumulado é útil para acompanhar o histórico de saldos ao longo do tempo, com as transações de crédito e débito afetando o saldo em direções opostas. O script fornece uma visão consolidada do saldo acumulado para cada transação.

 

with data as (
SELECT f.fin_id, 
				f.fin_entry_date,
				CASE
				WHEN f.fin_type = 'credit' THEN f.fin_amount
				ELSE 0
				END as credit,
				CASE
				WHEN f.fin_type = 'debit' THEN f.fin_amount
				ELSE 0
				END as debit,
				f.fin_description
				, SUM(f2.fin_amount) as soma
				
				, SUM ( f.fin_amount * CASE f.fin_type 
                           WHEN 'credit' THEN 1 
                           WHEN 'debit' THEN -1 
                       END ) AS sldacum
				
				
				FROM 
					iugu_financial f 
						INNER JOIN iugu_financial f2 ON f.fin_id = f2.fin_id
				WHERE 
					--f.id_account = '$kod_accounts'  and
						 f.fin_entry_date 
				BETWEEN '2019-11-10' AND '2019-11-10'   
				GROUP BY  f.fin_id--, f.fin_entry_date,  f.fin_description
	)

--select fin_id, fin_entry_date, credit , debit , sum (sldacum) as sldacum  from data
--GROUP BY  fin_id, fin_entry_date, credit , debit			
--ORDER BY fin_id  ASC

select fin_id, fin_entry_date, credit , debit
 --, sum(sldacum) OVER (PARTITION BY fin_id ORDER BY fin_id) AS cum_amt
 ,sum(sldacum) over (order by fin_id asc rows between unbounded preceding and current row)
 from data

Data de Publicação: 30-10-2023

Categoria: PostgreSQL