我有Balances表的这个表结构:
这就是观点:
我还有Amounts表的这个结构:
这是Amounts表的查看模式:
首先,我需要在Amounts表中获取特定日期的金额值:
使用此查询我在2016年7月7日获得金额300。 一旦达到这个数字,我需要使用Balances表进行递归查询。 最终结果应该是这样的:
Name abstractAmount addAmount Balance
----- -------------- --------- -------
Josep 100 400
Maria 50 350
George 60 410
Julianne 25 385
这是什么?从Amounts表中取300这个结果,对于Balance表中的每一行,我看到:
如果第一行中的abstracAmount不为空,我进行这个数学计算:balance =(300 - abstractAmount),如果是空的,并且addAmount列有值,我使这个数学计算平衡=(300 + addAmount)
在其余行中我做同样但计算不在300上,在最后一行余额上:
例如:
在第一行中,余额为400,因为addamount具有值,因此我进行此计算:300 + 100 = 400
在第二行中,余额为350,因为abstractAmount不为空,因此我将最后一行的余额值进行计算:400 - 50 = 350。
对于其余行,同样的事情,只有第一行采用金额表的余额值。
注意:
1.始终列abstractAmount减去值以及addAmount列的总和值。
此列中的其中一列(abstractAmount | addAmount)将为空。
- 醇>
只有第一行获取值才能对Amounts表进行数学计算,其余行将获取之前行的值。
如何获得最终结果? :
Name abstractAmount addAmount Balance
----- -------------- --------- -------
Josep 100 400
Maria 50 350
George 60 410
Julianne 25 385
我接受建议,谢谢。
答案 0 :(得分:3)
您可以使用窗口函数代替递归。更具体地说,总和超过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。
要从金额表中获取基数,您可以简单地将(选择... 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
的交叉联接,您将获得所有可能的余额