如何使这个查询递归Sql Server?

时间:2016-07-08 10:56:59

标签: sql sql-server sql-server-2014 recursive-query

我有Balances表的这个表结构:

enter image description here

这就是观点:

enter image description here

我还有Amounts表的这个结构:

enter image description here

这是Amounts表的查看模式:

enter image description here

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

enter image description here

使用此查询我在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列的总和值。

     
      
  1. 此列中的其中一列(abstractAmount | addAmount)将为空。

  2.   
  3. 只有第一行获取值才能对Amounts表进行数学计算,其余行将获取之前行的值。

  4.   

如何获得最终结果? :

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

我接受建议,谢谢。

1 个答案:

答案 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的交叉联接,您将获得所有可能的余额