Esr*_*_92 6 sql sql-server recursive-query sql-server-2014
我有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
Run Code Online (Sandbox Code Playgroud)
这是什么?这个结果是从Amounts表中取300来实现的,而对于Balance表中的每一行,我看到:如果第一行中的abstracAmount不为空,我进行这个数学计算:balance =(300 - abstractAmount),万一是empty和addAmount列有值我做这个数学计算balance =(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
Run Code Online (Sandbox Code Playgroud)
我接受建议,谢谢.
您可以使用窗口函数来代替递归。更具体地说,求和rows unbounded preceding以获得运行总计(+起始余额):
select *,300 + sum(isnull(addAmount,0) - ISNULL(abstractAmount,0)) over (order by id rows unbounded preceding) Balance
from Balances
Run Code Online (Sandbox Code Playgroud)
这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'
Run Code Online (Sandbox Code Playgroud)
通过不带 的交叉连接where,您将获得所有可能的余额
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |