ऐसा करने का सबसे आसान तरीका रनिंग एग्रीगेट का उपयोग करना होगा। आपके मूल उदाहरण में, आपके पास दो टेबल थे, और यदि ऐसा है, तो बस उस तालिका पर एक योग चलाएं जैसे मैं उप-चयन में कर रहा हूं और उस मान को वेरिएबल में संग्रहीत करता हूं जिसे मैंने @Sum बनाया है।
सीटीई गणना करता है कि प्रत्येक रिकॉर्ड के लिए एक साथ जोड़े जाने पर मूल्य क्या होगा, और फिर कुल गणना में जोड़ा जाता है, और फिर जो सकारात्मक होते हैं उन्हें रखता है।
मुझे विश्वास है कि यह आपकी आवश्यकता के अनुरूप होगा।
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