3

基数 10 と、2013 年 11 月に関連付けられた値 20 と 2014 年 3 月に関連付けられた値 10 を持つテーブルがあるとします。すべての月のリストとそれらの複合値を入力したいと考えています。したがって、2013 年 5 月から 11 月までの値は 10 で、11 月から 3 月までの値は 10+20 で、その後は 10+20+10 になります。

したがって、テーブルには次のようなものがあります

MONTH     VALUE
Nov-2013  20
Mar-2014  10

どういうわけか返すselectステートメントが欲しいです。ベースとしてハードコーディングされた 10 の初期値があります。

MONTH     VALUE
May-2013  10
Jun-2013  10
Jul-2013  10
Aug-2013  10
Sep-2013  10
Oct-2013  10
Nov-2013  30
Dec-2013  30
Jan-2014  30
Feb-2014  30
Mar-2014  40

これは実行可能ですか?

4

1 に答える 1

3

私があなたの要求を正しく理解している場合、

SQL フィドル

Oracle 11g R2 スキーマのセットアップ:

CREATE TABLE months
    ("MON" date, "VALUE" int)
;

INSERT ALL 
    INTO months ("MON", "VALUE")
         VALUES (date '2013-11-01', 20)
    INTO months ("MON", "VALUE")
         VALUES (date '2014-03-01', 10)
SELECT * FROM dual
;

クエリ 1 :

with months_interval as (
select date '2013-05-01' interval_start, 
       max(mon) interval_end
  from months
)
, all_months as (
  select add_months(m.interval_start,level-1) mon
    from months_interval m
  connect by level <= months_between(interval_end, interval_start) + 1
), data_to_sum as (
select am.mon, 
       decode(am.mon, first_value(am.mon) over(order by am.mon), 10, m.value) value
  from months m, all_months am
   where am.mon = m.mon(+)
)  
select mon, value, sum(value) over(order by mon) cumulative
  from data_to_sum
 order by 1

結果

|                              MON |  VALUE | CUMULATIVE |
----------------------------------------------------------
|       May, 01 2013 00:00:00+0000 |     10 |         10 |
|      June, 01 2013 00:00:00+0000 | (null) |         10 |
|      July, 01 2013 00:00:00+0000 | (null) |         10 |
|    August, 01 2013 00:00:00+0000 | (null) |         10 |
| September, 01 2013 00:00:00+0000 | (null) |         10 |
|   October, 01 2013 00:00:00+0000 | (null) |         10 |
|  November, 01 2013 00:00:00+0000 |     20 |         30 |
|  December, 01 2013 00:00:00+0000 | (null) |         30 |
|   January, 01 2014 00:00:00+0000 | (null) |         30 |
|  February, 01 2014 00:00:00+0000 | (null) |         30 |
|     March, 01 2014 00:00:00+0000 |     10 |         40 |

これはおそらくパフォーマンスの面でわずかに最適ではなく(月のテーブルを2回クエリするなど)、最適化する必要がありますが、アイデアは次のとおりです-月のリストを事前に生成し(間隔の開始が何らかの形で固定されていると想定しました)、そのまま結合データ、分析合計関数を使用します。

于 2013-05-09T16:29:42.150 に答える