我具有“余额”表的此表结构:

sql - 如何使此查询递归Sql Server?-LMLPHP

这是 View :

sql - 如何使此查询递归Sql Server?-LMLPHP

我还有金额表的这种结构:

sql - 如何使此查询递归Sql Server?-LMLPHP

这是“金额”表的查看模式:

sql - 如何使此查询递归Sql Server?-LMLPHP

首先,我需要在金额表中获取特定日期的金额值:

sql - 如何使此查询递归Sql Server?-LMLPHP

与此查询,我得到日期300/07/2016的金额300。
一旦达到此数字,我需要使用Balances表进行递归查询。
最终结果应该是这样的:

    Name   abstractAmount   addAmount  Balance
   -----   --------------   ---------  -------
   Josep                      100        400
   Maria       50                        350
   George                     60         410
   Julianne    25                        385

这是什么?从“金额”表中获得300,就可以实现此结果,对于“余额”表中的每一行,我都会看到:
如果第一行中的abstracAmount不为空,则进行以下数学计算:balance =(300-abstractAmount),如果为空且addAmount列具有值,则使此数学计算为balance =(300 + addAmount)
在其余的行中,我做同样的事情,但是计算不是基于300,而是最后一行的余额:
例如:
在第一行中,余额为400,因为addamount具有值,因此我进行了以下计算:300 + 100 = 400
在第二行中,余额为350,因为abstractAmount不为空,因此我将最后一行的余额值进行计算:400-50 = 350。
对于其余各行,同样的事情,只有第一行采用金额表的余额值。



如何获得最终结果? :
       Name     abstractAmount  addAmount   Balance
       -----   --------------   ---------  -------
       Josep                      100        400
       Maria       50                        350
       George                     60         410
       Julianne    25                        385

我接受建议,谢谢。

最佳答案

可以使用窗口函数来代替递归。更具体地说,是rows unbounded preceding上的总和,以得出总金额(+初始余额):

select *,300 +  sum(isnull(addAmount,0) - ISNULL(abstractAmount,0))  over (order by id rows unbounded preceding) Balance
from Balances
isnull(addAmount,0) - ISNULL(abstractAmount,0)只是每一行的变异。 over (order by id rows unbounded preceding)根据ID将总和的范围限定在当前行和所有先前的行中。

要从金额表中获取基数,您可以简单地将(select ... where date ..)作为值而不是'300'或更漂亮:通过交叉连接到金额表:
select b.*, a.dateInsertion,a.amount, a.amount +  sum(isnull(addAmount,0) - ISNULL(abstractAmount,0))  over (order by b.id rows unbounded preceding) Balance
from Balances b
cross join Amounts a
where a.dateInsertion = '20160707'

使用没有where的交叉联接,您将获得所有可能的余额

关于sql - 如何使此查询递归Sql Server?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/38264956/

10-08 22:23
查看更多