gpt4 book ai didi

sql - 我怎样才能让这个查询递归Sql Server?

转载 作者:行者123 更新时间:2023-12-02 20:36:53 25 4
gpt4 key购买 nike

我有余额表的表结构:

enter image description here

这是 View :

enter image description here

我也有这样的金额表结构:

enter image description here

这是金额表的查看模式:

enter image description here

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

enter image description here

通过此查询,我得到 2016 年 7 月 7 日的金额 300。一旦达到这个数字,我需要对余额表进行递归查询。最终结果应该是这样的:

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

这是什么?这个结果是通过从 Amounts 表中取 300 来实现的,对于 Balance 表中的每一行,我看到:如果第一行中的abstracAmount不为空,我会进行以下数学计算:balance = (300 - AbstractAmount),如果为空并且addAmount列有值,我会进行此数学计算balance = (300 + addAmount)在其余行中,我执行相同的操作,但计算不是基于 300,而是基于最后一行余额:例如:第一行中的余额为 400,因为附加金额具有值(value),因此我进行以下计算:300 + 100 = 400在第二行中,余额为 350,因为 AbstractAmount 不为空,因此我采用最后一行的余额值并进行计算:400 - 50 = 350。对于其余行也是如此,只有第一行采用金额表的余额值。

Notes:
1. Always the column abstractAmount subtracts values, and the addAmount column sum values.

  1. Always one of this columns (abstractAmount | addAmount) will be empty .

  2. Only the first row takes the value to make the mathematical calculation for the Amounts table, the rest of rows takes the value for the row before.

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

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

我接受建议,谢谢。

最佳答案

您可以使用窗口函数来代替递归。更具体地说,对前面无界的行求和以获得运行总计(+起始余额):

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 unboundedleading) 将总和的范围限定为当前行以及根据 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com