我有一张桌子和一个单值
Table 1
SNo Amount
1 100
2 500
3 400
4 100
Value: 800
现在我希望表中的结果是减去值,最后是
我想进行滚动减法,即从表1的第一个数量中减去值800,然后将其应用于后续行。例如:
for type-1
800 - 100 (Record1) = 700
700 - 500 (record2) = 200
200 - 400 (record3) = -200
表格记录从记录3开始,余额值余额为200
Table-Output
SNo Amount
1 200
2 100
表示如果第一个表中的减去800,则前两个记录将被删除,而第三个记录200中的是余额
答案 0 :(得分:2)
最简单的方法是使用正在运行的聚合。在您的原始示例中,您有两个表,如果是这种情况,只需在该表上运行一个总和,就像我在子选择中一样,并将该值存储在我创建的变量@Sum中。
CTE计算每个记录加起来的值,然后将其加到计算的总数中,然后保留正数。
我相信这符合你的需要。
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