Der einfachste Weg, dies zu tun, wäre die Verwendung eines laufenden Aggregats. In Ihrem ursprünglichen Beispiel hatten Sie zwei Tabellen, und wenn dies der Fall ist, führen Sie einfach eine Summe für diese Tabelle aus, wie ich es in der Unterauswahl tue, und speichern Sie diesen Wert in der von mir erstellten Variablen @Sum.
Der CTE berechnet, was der Wert wäre, wenn er für jeden Datensatz addiert wird, und wird dann zur berechneten Gesamtsumme addiert, und behält dann die positiven.
Ich glaube, dass dies Ihren Anforderungen entspricht.
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