我不知道如果我完全理解你的邏輯,但我認爲這可以用遞歸CTE來完成:
我添加了另一個專案組證明,這種方法可以一次處理不同的羣體。
declare @tdac table(secnum varchar(100),bucketcode varchar(100),caseid int,acc varchar(100),defqty int);
insert @tdac(secnum,bucketcode,caseid,acc,defqty)
values('ax1','cor',1,'012',-100)
,('ax1','cor',2,'012',-50)
,('ax1','cor',3,'012',-150)
,('ax2','cor',1,'012',-100)
,('ax2','cor',2,'012',-100);
declare @dac table(secnum varchar(100),bucketcode varchar(100),caseid int,acc varchar(100),defqty int);
insert @dac(secnum,bucketcode,caseid,acc,defqty)
values('ax1','cor',0,'012',-125)
,('ax2','cor',0,'012',-150);
- 首CTE會發現所有不同的羣體和起始值添加@dac的值設定
WITH DistinctGroups AS
(
SELECT t.secnum,t.bucketcode,t.acc,d.defqty
FROM @tdac AS t
LEFT JOIN @dac AS d ON d.secnum=t.secnum and d.bucketcode=t.bucketcode AND d.acc=t.acc
GROUP BY t.secnum,t.bucketcode,t.acc,d.defqty
)
-the遞歸CTE
,recursiveCTE AS
(
--anchor: Get the rows with the minimal caseid from each group
SELECT t.secnum,t.bucketcode,t.caseid,t.acc,t.defqty,CASE WHEN x.NewQty>0 THEN 0 ELSE x.NewQty END AS NewQty,CASE WHEN x.NewQty>0 THEN x.NewQty ELSE 0 END AS NewDiff
FROM @tdac AS t
INNER JOIN DistinctGroups AS gr ON t.secnum=gr.secnum AND t.bucketcode=gr.bucketcode AND t.acc=gr.acc
CROSS APPLY(SELECT t.defqty-gr.defqty AS NewQty) AS x
WHERE t.caseid=(SELECT MIN(caseid) FROM @tdac AS t2 WHERE t2.secnum=gr.secnum AND t2.bucketcode=gr.bucketcode AND t2.acc=gr.acc)
UNION ALL
--find the row with the next caseid and add the diff value of the previous row
SELECT t.secnum,t.bucketcode,t.caseid,t.acc,t.defqty,CASE WHEN x.NewQty>0 THEN 0 ELSE x.NewQty END AS NewQty,CASE WHEN x.NewQty>0 THEN x.NewQty ELSE 0 END AS NewDiff
FROM @tdac AS t
INNER JOIN recursiveCTE AS r ON t.secnum=r.secnum AND t.bucketcode=r.bucketcode AND t.acc=r.acc
CROSS APPLY(SELECT t.defqty+r.NewDiff AS NewQty) AS x
WHERE t.caseid=r.caseid+1
)
select *
from recursiveCTE
order by secnum,caseid
結果
ax1 cor 1 012 -100 0 25
ax1 cor 2 012 -50 -25 0
ax1 cor 3 012 -150 -150 0
ax2 cor 1 012 -100 0 50
ax2 cor 2 012 -100 -50 0
問題解決了嗎?你需要進一步的幫助嗎?請允許我提示一個提示:如果這個問題已經解決,那麼在(最佳)答案的投票櫃檯下面勾選驗收檢查將會非常友善。這將1)標記這個問題已解決2)使追隨者更容易找到最佳的解決方案3)支付點給回答者和4)支付點給你。一旦你自己超過了15分的邊界,你又被要求對貢獻進行投票。這是SO的方式來說聲謝謝。快樂編碼! – Shnugo