各口座の現在の残高があり、トランザクションの正味額を差し引いて、過去 24 か月の前月の最終残高を作成する必要があります。以下はサンプル データセットです。
create table txn_by_month (
memberid varchar(15)
,accountid varchar(15)
,effective_year varchar(4)
,effective_month varchar(2)
,balance money
,netamt money
,prev_mnthendbal money)
insert into txn_by_month values
(10001,111222333,2012,12,634.15,-500,1134.15)
,(10001,111222333,2012,11,NULL,-1436,NULL)
,(10001,111222333,2012,10,NULL,600,NULL)
,(10002,111333444,2012,12,1544.20,1650,-105.80)
,(10002,111333444,2012,11,NULL,1210,NULL)
,(10002,111333444,2012,10,NULL,-622,NULL)
,(10003,111456456,2012,01,125000,1200,123800)
,(10003,111456456,2011,12,NULL,1350,NULL)
,(10003,111456456,2011,11,NULL,-102,NULL)
ご覧のとおり、各月のすべてのトランザクションを合計したテーブルが既にあります。最初の行で前月末の残高を計算し、それを 2 行目、3 行目などに下げる必要があるだけです。これは私が持っているものです。
;
WITH CTEtest AS
(SELECT ROW_NUMBER() OVER (PARTITION BY memberid order by(accountid)) AS Sequence
,memberid
,accountid
,prev_mnthendbal
,netamt
FROM txn_by_month)
select c1.memberid
,c1.accountid
,c1.sequence
,c2.prev_mnthendbal as prev_mnthendbal
,c1.netamt,
COALESCE(c2.prev_mnthendbal, 0) - COALESCE(c1.netamt, 0) AS cur_mnthendbal
FROM CTEtest AS c1
LEFT OUTER JOIN CTEtest AS c2
ON c1.memberid = c2.memberid
and c1.accountid = c2.accountid
and c1.Sequence = c2.Sequence + 1
これは、シーケンス = 2 でのみ機能します。cur_mnthendbal の値を次の行に移動する必要があることはわかっていますが、その方法について頭を悩ませているようには見えません。別の CTE が必要ですか?
どんな助けでも大歓迎です!
編集: 多分私はそれをもっとよく説明する必要があります.... もし私がこれを持っているなら;
行 2 の残高は、行 1 の prev_mnthendbal ($1,134.15) になります。次に、2 行目の prev_mnthendbal は残高 - netamt ($1,134.15 - (-$1,436) = $2,570.15) になります。CTE を使用しようとしていますが、前の行の prev_mnthendbal を残高フィールドに入力する方法がわかりません (残高が利用可能になるまで計算されないため)。多分私はCTEを使用できませんか?カーソルを使用する必要がありますか?