This is the code I used to get the output. You will have to adapt it to your setup, and just make sure you substitute your unique id for my "TRAN_ID." The TRAN_ID field is used as a tie-breaker when you have records on the same date.-- sets up a temp table using data you suggestedSET NOCOUNT ON;DECLARE @T1 TABLE(TRAN_ID INT IDENTITY, ACCT VARCHAR(4), TRAN_SOURCE VARCHAR(3), TRANDATE DATETIME, TRANAMOUNT MONEY);INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-01-01 00:00:00.000', 402.00000);INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-05-28 00:00:00.000', 0.00000);INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-06-02 00:00:00.000', 0.00000); INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-06-03 00:00:00.000', 0.00000); INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-06-04 00:00:00.000', 0.00000); INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-06-18 00:00:00.000', 0.00000); INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-12-31 00:00:00.000', 134218.53000);INSERT INTO @T1(ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT) VALUES('1000', 'xxx', '2009-12-31 00:00:00.000', 135599.92000);-- solution code starts hereWITH C AS ( SELECT ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT, ROW_NUMBER() OVER(ORDER BY TRANDATE) AS TRAN_ID FROM @T1)SELECT ACCT, TRAN_SOURCE, TRANDATE, TRANAMOUNT, (SELECT SUM(B.TRANAMOUNT) FROM C AS B WHERE B.TRANDATE <= A.TRANDATE AND B.TRAN_ID <= A.TRAN_ID) AS RunBalFROM C AS AORDER BY TRANDATE, TRAN_ID;