Najprostszym sposobem na to byłoby użycie działającego agregatu. W oryginalnym przykładzie miałeś dwie tabele, a jeśli tak jest, po prostu uruchom sumę na tej tabeli, tak jak robię to w podselekcji, i zapisz tę wartość w utworzonej przeze mnie zmiennej @Sum.
CTE oblicza, jaka byłaby wartość, gdy jest sumowana dla każdego rekordu, a następnie jest dodawana do obliczonej sumy, a następnie zachowuje te, które są dodatnie.
Wierzę, że to zaspokoi Twoje potrzeby.
DECLARE @Sum INT;
SET @Sum = 800;
WITH RunningTotals
AS (
SELECT [SNo]
, [Amount]
, [Amount] + (
SELECT ISNULL(SUM([Amount]), 0)
FROM [Table1] t2
WHERE t2.[SNo] < t.SNo
) [sums]
FROM [Table1] t
),
option_sums
AS (
SELECT ROW_NUMBER() OVER ( ORDER BY [SNo] ) [SNo]
, CASE WHEN ( [Sums] - @Sum ) > 0 THEN [Sums] - @Sum
ELSE [Amount]
END AS [Amount]
, sums
, [Amount] [OriginalAmount]
, [OriginalID] = [SNo]
FROM [RunningTotals] rt
WHERE ( [Sums] - @Sum ) > 0
)
SELECT [SNo]
, CASE [SNo]
WHEN 1 THEN [Amount]
ELSE [OriginalAmount]
END AS [Amount]
, [OriginalID]
FROM option_sums
SNo Amount OriginalID
--- ------ ----------
1 200 3
2 100 4
3 100 5
4 500 6
5 400 7
6 100 8
7 200 9