[英]How can I make this query recursive Sql Server?
我有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),萬一是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
我接受建議,謝謝。
您可以使用窗口函數代替遞歸。 更具體地說,在獲得運行總計(+開始余額) 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)
將和的范圍限定為當前行和所有前面的行。
要從金額表中獲取基數,您可以簡單地將(選擇... 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
的交叉連接,您將獲得所有可能的余額
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.