计算多行

时间:2017-07-12 09:32:15

标签: sql sql-server window-functions

我正在尝试根据之前行的值更新列。我的数据如下:

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。 任何想法,如何在没有迭代结构的情况下解决这个问题?

2 个答案:

答案 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