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

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列的总和值.

  1. 始终其中一列(abstractAmount | addAmount)将为空.

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

我怎样才能得到这个最终结果?:

       Name     abstractAmount  addAmount   Balance
       -----   --------------   ---------  -------
       Josep                      100        400       
       Maria       50                        350
       George                     60         410
       Julianne    25                        385
Run Code Online (Sandbox Code Playgroud)

我接受建议,谢谢.

Me.*_*ame 3

您可以使用窗口函数来代替递归。更具体地说,求和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,您将获得所有可能的余额