Cách dễ nhất để làm điều này là sử dụng một tập hợp đang chạy. Trong ví dụ ban đầu của bạn, bạn có hai bảng và nếu trường hợp này xảy ra, chỉ cần chạy một tổng trên bảng đó giống như tôi đang làm trong phần chọn con và lưu trữ giá trị đó trong biến mà tôi đã tạo @Sum.
CTE tính toán giá trị sẽ là bao nhiêu khi nó được cộng lại với nhau cho mỗi bản ghi, sau đó được cộng vào tổng số đã tính, rồi giữ lại những giá trị dương.
Tôi tin rằng điều này sẽ phù hợp với nhu cầu của bạn.
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