is this close?
--code based on ChrisM fine work at http://www.sqlservercentral.com/Forums/Topic1731617-391-1.aspx
CREATE TABLE #t1
(TransactionID INT,
Customer INT,
TransactionType VARCHAR(10),
[Date] DATE,
Amount MONEY,
CreditID INT
);
INSERT INTO #t1 VALUES(1, 1, 'Credit', '1/1/16', -20, 1);
INSERT INTO #t1 VALUES(2, 1, 'Debit', '1/2/16', 20, NULL);
INSERT INTO #t1 VALUES(3, 1, 'Credit', '1/3/16', -100, 2);
INSERT INTO #t1 VALUES(4, 1, 'Debit', '1/4/16', 50, NULL);
INSERT INTO #t1 VALUES(5, 1, 'Debit', '1/5/16', 50, NULL);
INSERT INTO #t1 VALUES(6, 1, 'Credit', '1/6/16', -50, 3);
INSERT INTO #t1 VALUES(7, 1, 'Debit', '1/7/16', 20, NULL);
INSERT INTO #t1 VALUES(8, 1, 'Credit', '1/8/16', -50, 4);
INSERT INTO #t1 VALUES(9, 1, 'Debit', '1/9/16', 20, NULL);
WITH
Debits AS (
SELECT debitdate = date,
DebitID = TransactionID,
DebitAmount = Amount,
[from] = ISNULL(LAG([to], 1) OVER(ORDER BY TransactionID), 0),
[to]
FROM
(
SELECT *,
[to] = SUM(Amount) OVER(ORDER BY TransactionID)
FROM #T1
WHERE TransactionType = 'Debit'
) d
)
,
Credits as (
SELECT CreditId,
PaymentID = TransactionID,
CreditAmount = -Amount,
[from] = ISNULL(LAG([to], 1) OVER(ORDER BY TransactionID), 0),
[to]
FROM
(
SELECT *,
[to] = SUM(-Amount) OVER(ORDER BY TransactionID)
FROM #T1
WHERE TransactionType = 'Credit'
) c
)
, Results as (
SELECT c.CreditId,
debitdate,
Balance = CASE
WHEN c.[to] > d.[to]
THEN c.[to] - d.[to]
WHEN d.[to] IS NULL
THEN c.CreditAmount
ELSE 0
END,
ROW_NUMBER() OVER(PARTITION BY c.CreditId ORDER BY DebitId DESC) rn
FROM Debits d
FULL OUTER JOIN Credits c ON c.[from] < d.[to] AND c.[to] > d.[from]
)
SELECT CreditId,
Balance AS remaining_balnce,
debitdate AS last_redeemed_date
FROM results
WHERE rn = 1
ORDER BY creditid;
DROP TABLE #t1
________________________________________________________________
you can lead a user to data....but you cannot make them think
and remember....every day is a school day