Nejjednodušší způsob, jak toho dosáhnout, by bylo použít běžící agregát. Ve vašem původním příkladu jste měli dvě tabulky, a pokud je tomu tak, jednoduše spusťte součet na této tabulce, jako to dělám v podvýběru, a uložte tuto hodnotu do proměnné, kterou jsem vytvořil @Sum.
CTE vypočítá, jaká by byla hodnota, když se sečte pro každý záznam, a poté se přičte k vypočtenému součtu a poté uchová ty, které jsou kladné.
Věřím, že to bude vyhovovat vašim potřebám.
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