我正在尝试根据之前行的值更新列。我的数据如下:
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
我想要做的是更新表格,以便从InvAmnt
中减去PayAmnt
的值。但是也需要考虑以前的行。这意味着,在第一行中我只从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
我尝试使用窗口函数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。 任何想法,如何在没有迭代结构的情况下解决这个问题?
答案 0 :(得分:1)
尝试以下一项。这就像减去PayAmnt并运行总计invamt一样。
SELECT [InvID], [InvAmnt], [orderId],isnull([PayAmnt],0)-SUM(InvAmnt) OVER(ORDER BY [InvID]) as PayAmnt
FROM #Table1
答案 1 :(得分:1)
您可以使用sum()窗口函数,如下所示:
Select *, PayAmnt = sum(InvAmnt) over() - Sum(InvAmnt) over(order by orderId)
from #payment
order by orderId