Este script SQL realiza cálculos de saldo acumulado com base em transações financeiras armazenadas na tabela "iugu_financial." `Principais partes do script:
-
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.
-
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
SUMque 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