Den nemmeste måde at gøre dette på ville være at bruge et løbende aggregat. I dit oprindelige eksempel havde du to tabeller, og hvis dette er tilfældet, skal du blot køre en sum på den tabel, som jeg gør i subselect og gemme denne værdi i den variabel, jeg oprettede @Sum.
CTE'en beregner, hvad værdien ville være, da den lægges sammen for hver post, og lægges derefter til den beregnede total, og beholder derefter dem, der er positive.
Jeg tror, at dette vil passe til dit behov.
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