2016-06-13 7 views
1

私は月ごとにソートされたデータをいくつか持っています。私がしようとしているのは、累計を得ることです。現在の月の合計は前月の合計に依存します。 IE(現在の月の合計)+(前月の合計)。このようtSQL - 再帰的実行合計

 
DATE  Totals 
04/2016 35.00 
05/2016 60.00 
06/2016 61.00 
... 

はスキーマは、表データの金額umonthであると言うことができますよう合計が生じるはずであるなるように

 
DATE  Amount 
04/2016 10.00 
04/2016 25.00 
05/2016 10.00 
05/2016 15.00 
06/2016 1.00 
... 

:私はそうのようにそれを持っているデータ。私はSum(Amount)は前月の合計+合計の合計ではないとして、これは動作しません知っている

Select umonth, LAG(SUM(Amount)) Over (Partition By umonth Order by umonth) Total from data 

これを理解しようとしています。助けて。これはストアドプロシージャのケースですか?カーソルで@currTotalを計算するために@prevTotalを設定できるようになりました。私の不快な言い訳になります。

これはMSSQL 2012データベースにあります。

+0

'from'テーブルの現在の月と同じかそれより小さい(<=)日付の列に、同じテーブルに再び参加し、定期的に列を合計することができます。 – gmiley

+0

これは私が予想していたよりも大きな問題に終わり、要件が「ローリングトータル」要求をはるかに超えているため、プロセスをスピードアップする必要がありました。すべての助けを感謝しますが、私はすでに投稿する前にほとんどの回答を試みました。スレッドを閉じます。 –

答えて

0

無制限のLAG()の合計を使用して終了しました。この問題はプロジェクトのスコープが大幅に変更され、複雑なローリングトータルが必要なくなり、単純なローリングトータル(2012年にLAG()とLEAD()関数が導入され、 。

前の提案をありがとうございます。

5

あなたが集約し、累積和でこれを行うことができます。

select umonth, 
     sum(sum(amount)) over (order by umonth) as Totals 
from data 
group by umonth; 
+0

合計はオーダーで動作しますか? – artm

+0

グループの代わりにdistinctを選択することもできます。 合計(金額)(単位はumonth)合計として データから – Kostya

1

でテストし、2012年に2008年

declare @data table(Date date, amount float) 

insert into @data 
values('04/01/2016',10.00), 
('04/01/2016',25.00), 
('05/01/2016',10.00), 
('05/01/2016',15.00), 
('06/01/2016',1.00) 

select Date, (select sum(amount) from @data d2 where d2.Date <=d1.Date) as runningTotal 
from @data d1 
group by date 

SQLサーバで動作し、私はあなたがこのような何かを行うことができると信じて。

select Date, SUM(amount) over(order by Date ROWS UNBOUNDED PRECDING) as runningtotal 
    from @date 
group by Date