La façon la plus simple de le faire serait d'utiliser un agrégat en cours d'exécution. Dans votre exemple d'origine, vous aviez deux tables, et si tel est le cas, exécutez simplement une somme sur cette table comme je le fais dans la sous-sélection et stockez cette valeur dans la variable que j'ai créée @Sum.
Le CTE calcule ce que serait la valeur telle qu'elle est additionnée pour chaque enregistrement, puis est ajoutée au total calculé, puis conserve celles qui sont positives.
Je pense que cela répondra à vos besoins.
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