TR_DATE | ACC_NAME | TYPE | AMOUNT |
---|---|---|---|
01-01-2017 | AVNEESH | CR | 60000 |
02-01-2017 | AVNEESH | DB | 8000 |
03-01-2017 | AVNEESH | CR | 8000 |
04-01-2017 | AVNEESH | DB | 5000 |
01-01-2017 | NUPUR | CR | 10000 |
02-01-2017 | NUPUR | DB | 8000 |
03-01-2017 | NUPUR | CR | 8000 |
And expected result for above data is
TR_DATE | ACC_NAME | TYPE | AMOUNT | BALANCE |
---|---|---|---|---|
01-01-2017 | AVNEESH | CR | 60000 | 60000 |
02-01-2017 | AVNEESH | DB | 8000 | 52000 |
03-01-2017 | AVNEESH | CR | 8000 | 60000 |
04-01-2017 | AVNEESH | DB | 5000 | 55000 |
01-01-2017 | NUPUR | CR | 10000 | 10000 |
02-01-2017 | NUPUR | DB | 8000 | 2000 |
03-01-2017 | NUPUR | CR | 8000 | 10000 |
CodePudding user response:
You can use the analytic version of the sum()
function, with a case expression to turn debits into negative amounts, and a window clause to apply the sum to amounts up to the current row's date:
select tr_date, acc_name, type, amount,
sum(case when type = 'DB' then -1 else 1 end * amount)
over (partition by acc_name order by tr_date) as balance
from passbook
order by acc_name, tr_date
TR_DATE | ACC_NAME | TYPE | AMOUNT | BALANCE |
---|---|---|---|---|
2017-01-01 | AVNEESH | CR | 60000 | 60000 |
2017-01-02 | AVNEESH | DB | 8000 | 52000 |
2017-01-03 | AVNEESH | CR | 8000 | 60000 |
2017-01-04 | AVNEESH | DB | 5000 | 55000 |
2017-01-01 | NUPUR | CR | 10000 | 10000 |
2017-01-02 | NUPUR | DB | 8000 | 2000 |
2017-01-03 | NUPUR | CR | 8000 | 10000 |