2016-04-08 43 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:但戈登的回答是正確的。這是一個簡單的運行總數。所有你需要考慮的是在你想要增加銷售的組(分區)內。 –