2016-12-17 14 views
1

こんにちは私はSQLに関して、誰かがこの問題で私を助けてくれることを願っていました。私はラグ関数を使用していましたが、合計範囲にするために書き直す方法があるのだろうかと思っていました。以前の1か月の代わりに、私は過去12ヶ月間を取って、各期間ごとに合計したいと思っています。私は12行のラグを書いてはいけませんが、少ないコード行でそれを得る方法があるのだろうかと思っていました。 nullが存在することに注意してください。また、12レコードのいずれかがNULLの場合、nullにする必要があります。SQL Server Lag関数を追加する範囲

enter image description here

私はあなたがこれを行うには、書き込みサブクエリを書くことができます知っているが、これが可能であればと思いまして。どんな助けでも大歓迎です。

+0

あなたはおそらく(左(期間別のパーティション上の和を()したいです、 4)注文の順番) – scsimon

+0

あなたは 'Sql Server'のどのバージョンを使用していますか? –

+0

あなたは必ず毎月行を持っていますか、行が見つからないことがありますか? –

答えて

1

ウインドウ機能の「ウインドウフレーム」の部分が必要です。あなたはdocumentationで窓枠を確認することができます

select t.*, 
     sum(balance) over (order by period rows between 11 preceding and current row) as moving_sum_12 
from t; 

:移動12ヶ月の平均は次のようになります。

累積合計が必要な場合は、ウィンドウフレームを完全に省略することができます。

私はあなたにもlag()を使用してこれを行うことができますことに注意しなければならないが、それははるかに複雑である:

select t.*, 
     (balance + 
     lag(balance, 1, 0) over (order by period) + 
     lag(balance, 2, 0) over (order by period) + 
     . . . 
     lag(balance, 11, 0) over (order by period) + 
     ) as sum_1112 
from t; 

これは、レコード場合に使用するデフォルト値であるlag()にほとんど知られていない第三引数を使用しています利用できません。それはcoalesce()を置き換えます。

EDIT:あなたは12個の値が利用できないNULL場合場合

、その後、casecount()にも使用します。

select t.*, 
     (case when count(*) over (order by period rows between 11 preceding and current row) = 12 
      then sum(balance) over (order by period rows between 11 preceding and current row) 
     end) as moving_sum_12 
from t; 
+0

しかし、いずれかの行がnullの場合はどうなりますか?あなたはメソッドがスキップして次の非null値をとると思います。 nullをインクルードしたいのですが、実際に12か月分のデータがないため、結果セットはnullになります。 –

+0

この値は無視されます。 –

+0

'count(*)'の代わりに 'count(balance)'にする必要があります。 –

関連する問題