April 5, 2021 at 8:02 pm
Here's another approach which uses a tally function to row multiply the 'Amount' column value(s) for both credits and debits. A similar approach to FIFO calculation recently won some points on Stack Overflow. In this case it's only necessary to SUM the SIGN(Amount)'s. The SIGN function returns either 1 (if the parameter is positive) or -1 (if the parameter is negative). For some reason here when the RemainingBalance is a credit it's expressed as a positive number, so the calculation multiples the sum of the signs by -1.
with
credits_cte as (
select *, row_number() over (partition by CustID
order by TransDate) trans_rn
from #Transactions t
cross apply dbo.fnTally(1, abs(t.Amount)) fn
where TransType='C'),
debits_cte as (
select *, row_number() over (partition by CustID
order by TransDate) trans_rn
from #Transactions t
cross apply dbo.fnTally(1, t.Amount) fn
where TransType='D')
select c.CustID, min(c.TransDate) CreditDate,
sum(isnull(sign(c.Amount), 0)+
isnull(sign(d.Amount), 0))*-1 RemainingBalance,
max(d.TransDate) LastRedeemedDate
from credits_cte c
full join debits_cte d on c.CustID=d.CustID
and c.trans_rn=d.trans_rn
group by c.TransID, c.CustID
order by c.TransID, c.CustID;
CustIDCreditDateRemainingBalanceLastRedeemedDate
12016-01-010.002016-02-01
22016-01-010.002016-03-01
32016-01-010.002016-04-01
32016-03-010.002016-06-01
32016-05-010.002016-06-01
42016-01-010.002016-04-01
42016-03-010.002016-07-01
42016-06-010.002016-07-01
52016-01-0110.002016-02-01
62016-01-0120.00NULL
72016-01-010.002016-03-01
72016-02-010.002016-03-01
82016-01-010.002016-04-01
82016-03-0130.002016-04-01
92016-01-010.002016-05-01
92016-03-010.002016-05-01
92016-04-0110.002016-05-01
102016-01-010.002016-02-01
102016-03-010.002016-05-01
102016-06-0110.002016-09-01
102016-08-0150.00NULL
Aus dem Paradies, das Cantor uns geschaffen, soll uns niemand vertreiben können
September 24, 2024 at 6:14 pm
????
Aus dem Paradies, das Cantor uns geschaffen, soll uns niemand vertreiben können
Viewing 2 posts - 16 through 16 (of 16 total)
You must be logged in to reply to this topic. Login to reply
This website stores cookies on your computer.
These cookies are used to improve your website experience and provide more personalized services to you, both on this website and through other media.
To find out more about the cookies we use, see our Privacy Policy