#1 TABLE1SQL ServerのCTEランニングバランス
idno | amount
-------------
1 | 700
2 | 500
#テーブル2
idno | amount1 | amount2 | amount3 | acctno
------------------------------------------
1 | 100 | 200 | 300 | 001
1 | 100 | 200 | 300 | 002
2 | 100 | 200 | 300 | 001
何が起こるしたいことは表1のamount1にtable2のから量を分配することで、AMOUNT2、amount3残りの残高を得て、次の行に適用します。私はCTEを使用しようとしましたが、実行中の残高を次の行に渡すことに固執しました。
問合せ:
Declare @table2 TABLE (idno varchar(max), amount1 decimal,amount2
decimal,amount3 decimal,acctno varchar(max))
INSERT INTO @table2 VALUES
('1',100,200,300,'001'),
('1',100,200,300,'002'),
('2',100,200,300,'001')
Declare @table1 TABLE (idno varchar(max), amount decimal)
INSERT INTO @table1 VALUES
('1',700),
('2',500);
WITH due AS (SELECT a.idno,a.amount,b.acctno,b.amount1,b.amount2,b.amount3
from @table1 a left join @table2 b on a.idno = b.idno),
payment AS (SELECT *,case when amount-amount1<0 then amount
else amount1 end as amount1pay
,case when amount-amount1<=0 then 0
when amount-amount1-amount2 <0 then amount-amount1
else amount2 end as amount2pay ,
case when amount-amount1-amount2<=0 then 0
when amount-amount1-amount2-amount3<0
then amount-amount1-amount2 else amount3 end as amount3pay
FROM due),
payment2 AS (SELECT SUM(amount-amount1pay-amount2pay-amount3pay)
OVER (PARTITION BY idno ORDER BY acctno
ROWS UNBOUNDED PRECEDING ) as balance,* FROM payment)
select * from payment2
現在の結果
balance | idno | amount | acctno | amount1 | amount2 | amount3 | amount1pay | amount2pay | amount3pay
---------------------------------------------------------------------------------------------------------
100 | 1 | 200 | 001 | 100 | 200 | 300 | 100 | 200 | 300
200 | 1 | 200 | 002 | 100 | 200 | 300 | 100 | 200 | 300
0 | 2 | 500 | 001 | 100 | 200 | 300 | 100 | 200 | 200
期待される結果
balance | idno | amount | acctno | amount1 | amount2 | amount3 | amount1pay | amount2pay | amount3pay
---------------------------------------------------------------------------------------------------------
100 | 1 | 200 | 001 | 100 | 200 | 300 | 100 | 200 | 300
100 | 1 | 200 | 002 | 100 | 200 | 300 | 100 | 0 | 0
0 | 2 | 500 | 001 | 100 | 200 | 300 | 100 | 200 | 200
ここで適用しようとしているルールは、現在、非常に不明です。達成しようとしていることの詳細を追加してください。 – iamdave