An answer containing a loop WHILE.
--Simulated your table
DECLARE @tbl TABLE
(
ID INT,
opening FLOAT,
Total FLOAT,
Closing FLOAT
)
--Testing values
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(1,0,3015591.25,3015591.25)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(2,0,2146798.4,NULL)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(3,0,3015591.25,NULL)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(4,0,2146798.4,NULL)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(5,0,3015591.25,NULL)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(6,0,2146798.4,NULL)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(7,0,3015591.25,NULL)
INSERT INTO @tbl(ID, opening , Total ,Closing) VALUES(8,0,2146798.4,NULL)
--Solution starts from here
DECLARE @StartCount INT, @TotalCount INT, @OPENING FLOAT,@CLOSING FLOAT
SELECT @TotalCount = MAX(ID) FROM @tbl;
SET @StartCount = 2;
WHILE(@StartCount <= @TotalCount)
BEGIN
SELECT @OPENING = ISNULL(Closing, 0) FROM @tbl WHERE ID = @StartCount - 1
SELECT @CLOSING = (@OPENING + Total) FROM @tbl WHERE ID = @StartCount
UPDATE @tbl
SET opening = @OPENING,
Closing = @CLOSING
WHERE ID = @StartCount
SELECT @StartCount = @StartCount + 1
END
SELECT * FROM @tbl
Hope this helps