USE tempdb
go
IF object_id('[tb]') IS NOT NULL
DROP TABLE [tb]
go
CREATE TABLE [tb]
(
[id] int,
[amt] int
)
INSERT [tb]
SELECT 1,
10
UNION ALL
SELECT 2,
-8
UNION ALL
SELECT 3,
7
UNION ALL
SELECT 4,
2
UNION ALL
SELECT 5,
-7
DECLARE @outstd int
SELECT @outstd = sum(amt) FROM tb
SELECT *, remain_open=0, openpos = 0
INTO #
FROM tb
WHERE amt > 0
ORDER BY id desc
DECLARE @run int
SET @run = @outstd
UPDATE # SET @run = @run - amt, openpos = @run, remain_open = openpos + amt
SELECT *,
CASE WHEN openpos > 0 THEN openpos ELSE remain_open END AS op,
@outstd AS outstanding
FROM #
WHERE remain_open > 0
DROP TABLE #
go
IF object_id('[tb]') IS NOT NULL
DROP TABLE [tb]
go
CREATE TABLE [tb]
(
[id] int,
[amt] int
)
INSERT [tb]
SELECT 1,
10
UNION ALL
SELECT 2,
-8
UNION ALL
SELECT 3,
7
UNION ALL
SELECT 4,
2
UNION ALL
SELECT 5,
-7
DECLARE @outstd int
SELECT @outstd = sum(amt) FROM tb
SELECT *, remain_open=0, openpos = 0
INTO #
FROM tb
WHERE amt > 0
ORDER BY id desc
DECLARE @run int
SET @run = @outstd
UPDATE # SET @run = @run - amt, openpos = @run, remain_open = openpos + amt
SELECT *,
CASE WHEN openpos > 0 THEN openpos ELSE remain_open END AS op,
@outstd AS outstanding
FROM #
WHERE remain_open > 0
DROP TABLE #