计算多行的值
Calculate a value over several rows
我正在尝试根据前几行的值更新列。我的数据如下所示:
InvID InvAmnt PayAmnt orderId
1 10,00 100,00 1
2 20,00 100,00 2
3 30,00 100,00 3
4 40,00 100,00 4
我想做的是更新 table,以便从 PayAmnt
中减去 InvAmnt
的值。但也需要考虑前面的行。这意味着,在第一行中,我只是从 100 中减去 10,得到 90。在第二行中,我从 90(这是第一行中的结果)中减去 20,得到 70,依此类推。所需的输出如下所示:
InvID InvAmnt PayAmnt orderId
1 10,00 90,00 1
2 20,00 70,00 2
3 30,00 40,00 3
4 40,00 0,00 4
我试着用 window 函数 LAG
这样做:
select ID, InvID, InvAmnt
,LAG(PayAmnt - InvAmnt,1,PayAmnt) OVER (PARTITION BY ID ORDER BY OrderId) - InvAmnt PayAmnt
,orderId
from #payment
order by orderId
但这给了我一个结果,它只考虑了最后一行而不考虑前面的行:
InvID InvAmnt PayAmnt orderId
1 10,00 90,00 1
1 20,00 70,00 2
1 30,00 50,00 3
1 40,00 30,00 4
这里发生的是,在第一行中,新值是原始 PayAmnt (100) 减去 InvAmnt(10),结果是 90,这是正确的。在第二行中,它从前几行 PayAmnt(100) 减去 InvAmnt(10) 中减去 InvAmnt (70)。结果 70 也是正确的。但在下一行它失败了,因为秒行 PayAmnt 尚未更新为 70,计算结果为 (100 - 20) - 30,这导致错误的 50。
任何想法,如何在没有迭代构造的情况下解决这个问题?
试试下面的一个。这就像减去 PayAmnt 和 运行 invamt 的总和。
SELECT [InvID], [InvAmnt], [orderId],isnull([PayAmnt],0)-SUM(InvAmnt) OVER(ORDER BY [InvID]) as PayAmnt
FROM #Table1
您可以使用 sum() 窗口函数如下:
Select *, PayAmnt = sum(InvAmnt) over() - Sum(InvAmnt) over(order by orderId)
from #payment
order by orderId
我正在尝试根据前几行的值更新列。我的数据如下所示:
InvID InvAmnt PayAmnt orderId 1 10,00 100,00 1 2 20,00 100,00 2 3 30,00 100,00 3 4 40,00 100,00 4
我想做的是更新 table,以便从 PayAmnt
中减去 InvAmnt
的值。但也需要考虑前面的行。这意味着,在第一行中,我只是从 100 中减去 10,得到 90。在第二行中,我从 90(这是第一行中的结果)中减去 20,得到 70,依此类推。所需的输出如下所示:
InvID InvAmnt PayAmnt orderId 1 10,00 90,00 1 2 20,00 70,00 2 3 30,00 40,00 3 4 40,00 0,00 4
我试着用 window 函数 LAG
这样做:
select ID, InvID, InvAmnt
,LAG(PayAmnt - InvAmnt,1,PayAmnt) OVER (PARTITION BY ID ORDER BY OrderId) - InvAmnt PayAmnt
,orderId
from #payment
order by orderId
但这给了我一个结果,它只考虑了最后一行而不考虑前面的行:
InvID InvAmnt PayAmnt orderId 1 10,00 90,00 1 1 20,00 70,00 2 1 30,00 50,00 3 1 40,00 30,00 4
这里发生的是,在第一行中,新值是原始 PayAmnt (100) 减去 InvAmnt(10),结果是 90,这是正确的。在第二行中,它从前几行 PayAmnt(100) 减去 InvAmnt(10) 中减去 InvAmnt (70)。结果 70 也是正确的。但在下一行它失败了,因为秒行 PayAmnt 尚未更新为 70,计算结果为 (100 - 20) - 30,这导致错误的 50。 任何想法,如何在没有迭代构造的情况下解决这个问题?
试试下面的一个。这就像减去 PayAmnt 和 运行 invamt 的总和。
SELECT [InvID], [InvAmnt], [orderId],isnull([PayAmnt],0)-SUM(InvAmnt) OVER(ORDER BY [InvID]) as PayAmnt
FROM #Table1
您可以使用 sum() 窗口函数如下:
Select *, PayAmnt = sum(InvAmnt) over() - Sum(InvAmnt) over(order by orderId)
from #payment
order by orderId