我具有“余额”表的此表结构:
这是 View :
我还有金额表的这种结构:
这是“金额”表的查看模式:
首先,我需要在金额表中获取特定日期的金额值:
与此查询,我得到日期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/