I need to do a summation of a result based on account and transaction date. I have the following result:
ACCOUNT_ID TRANSACTION_DATE AMOUNT
581 05-SEP-23 309.32
581 08-SEP-23 1863.76
581 15-SEP-23 0.26
581 21-SEP-23 23.17
with transaction_tbl
AS (
select 581 ACCOUNT_ID, TO_DATE('05-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 309.32 AMOUNT from dual
union all
select 581 ACCOUNT_ID, TO_DATE('08-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 1863.76 AMOUNT from dual
union all
select 581 ACCOUNT_ID, TO_DATE('15-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 0.26 AMOUNT from dual
union all
select 581 ACCOUNT_ID, TO_DATE('21-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 23.17 AMOUNT from dual
)
SELECT
ACCOUNT_ID,TRANSACTION_DATE,AMOUNT
FROM
transaction_tbl
--where TRANSACTION_DATE < asofdate ;
I have the following case that I was unable to process.
Case when TRANSACTION_DATE < asofdate TO_DATE('06-09-2023', 'DD-MM-YYYY') expected result;
581 05-SEP-23 309.32
Case when TRANSACTION_DATE < asofdate TO_DATE('09-09-2023', 'DD-MM-YYYY') expected result;
581 08-SEP-23 2173.08
Case when TRANSACTION_DATE < asofdate TO_DATE('18-09-2023', 'DD-MM-YYYY') expected result;
581 15-SEP-23 2173.34
Case when TRANSACTION_DATE < asofdate TO_DATE('22-09-2023', 'DD-MM-YYYY') expected result;
581 21-SEP-23 2196.51
The idea is that I need to recalculate the result based on previous data for a date that exists as a transaction.
You can use use aggregate functions together wir an GROUP BY clause like this:
with transaction_tbl
AS (
select 581 ACCOUNT_ID, TO_DATE('05-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 309.32 AMOUNT
union all
select 581 ACCOUNT_ID, TO_DATE('08-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 1863.76 AMOUNT
union all
select 581 ACCOUNT_ID, TO_DATE('15-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 0.26 AMOUNT
union all
select 581 ACCOUNT_ID, TO_DATE('21-09-2023', 'DD-MM-YYYY') TRANSACTION_DATE, 23.17 AMOUNT
)
SELECT
ACCOUNT_ID, max(TRANSACTION_DATE), sum(AMOUNT)
FROM
transaction_tbl
where TRANSACTION_DATE < TO_DATE('22-09-2023', 'DD-MM-YYYY')
group by 1;