2016-04-08 20 views
2

全体の累積値を追加し、私は次のようなデータを持っていると言う:は年と月

select 1 id, 'A' name, '2007' year, '04' month, 5 sales from dual union all 
select 2 id, 'B' name, '2007' year, '05' month, 2 sales from dual union all 
select 3 id, 'B' name, '2008' year, '12' month, 3 sales from dual union all 
select 4 id, 'B' name, '2009' year, '12' month, 56 sales from dual union all 
select 5 id, 'C' name, '2009' year, '08' month, 89 sales from dual union all 
select 6 id, 'A' name, '2010' year, '12' month, 4 sales from dual union all 
select 7 id, 'C' name, '2011' year, '12' month, 24 sales from dual union all 
select 8 id, 'D' name, '2012' year, '12' month, 15 sales from dual union all 
select 9 id, 'D' name, '2013' year, '12' month, 12 sales from dual union all 
select 10 id,'D' name, '2014' year, '12' month, 16 sales from dual union all 
select 11 id,'A' name, '2015' year, '07' month, 18 sales from dual union all 
select 12 id,'B' name, '2015' year, '09' month, 29 sales from dual union all 
select 13 id,'B' name, '2016' year, '01' month, 10 sales from dual union all 
select 14 id,'A' name, '2016' year, '02' month, 8 sales from dual union all 
select 15 id,'D' name, '2016' year, '03' month, 12 sales from dual union all 
select 16 id,'E' name, '2016' year, '04' month, 34 sales from dual 

私が累積的にすべてのすべての年にわたる販売とそれらの各期間(ヶ月)をアップ追加したいです。 出力は次のようになります。

name year month sale opening bal closing bal 
A  2007  04  5  0    5 
A  2007  05  2  5    7 
B  2008  12  3  12    15 
B  2009  12  56  15    71 
C  2009  08  89  71    160 
A  2010  12  4  160   164 
C  2011  12  24  164   188 
D  2012  12  15  188   203 
D  2013  12  12  203   215 
D  2014  12  16  215   231 
A  2015  07  18  231   249 
B  2015  09  29  249   278 
B  2016  01  10  278   288 
A  2016  02  8  288   296 
D  2016  03  12  296   308 
E  2016  04  34  308   342 

期首残高は前月の期末残高であり、それは来年の期首残高よりも、来年になった場合、前年度の決算残高です。それはその後の年のようにこれのように働くことができるはずです。

私はOracle 12cで作業しています。

ありがとうございます。

答えて

1

あなたは、ウィンドウ関数を使用してこれらの計算を行うことができます。

select t.*, 
     (sum(s) over (order by year, month) - s) as opening 
     sum(s) over (order by year, month) as closing 
from t; 

期首残高も句をウィンドウイング範囲/行を使用することができます。

select t.*, 
     sum(s) over (order by year, month rows between unbounded preceding and 1 preceding) as opening 
     sum(s) over (order by year, month) as closing 
from t; 

はしかし、私は、減算が簡単な方法だと思います。

+0

実際のシナリオではこんにちは。私は名前、年齢、住所などの多くの列を識別しています。あなたのソリューションにパーティションを追加していますが、正しい結果が返されません。 (名前、年齢、年齢、年別の住所順) – bytebiscuit

+1

@bytebiscuit:しかしゴードンの答えは正しいです。これは単純な実行合計です。考えてみたいことは、売上を加算したいグループ(パーティション)内にあることだけです。 –