De eenvoudigste manier om dit te doen, is door een lopend aggregaat te gebruiken. In je oorspronkelijke voorbeeld had je twee tabellen, en als dit het geval is, voer dan gewoon een som uit op die tabel zoals ik doe in de subselect en sla die waarde op in de variabele die ik heb gemaakt @Sum.
De CTE berekent wat de waarde zou zijn als deze voor elk record wordt opgeteld en vervolgens wordt opgeteld bij het berekende totaal, en houdt dan de positieve waarden bij.
Ik geloof dat dit aan uw behoeften zal voldoen.
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