sql >> データベース >  >> RDS >> Oracle

前月または前年度の欠落データを累積的に追加する

    CTEのサンプルデータから始まる@boneistsアプローチのバリエーション:

    with t as (
      select 1 id, 'A' name, '2007' year, '04' month,  5 sales  from dual union all
      select 2 id, 'A' 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 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
    ),
    y (year, rnk) as (
      select year, dense_rank() over (order by year)
      from (select distinct year from t)
    ),
    r (name, year, month, sales, rnk) as (
      select t.name, t.year, t.month, t.sales, y.rnk
      from t
      join y on y.year = t.year
      union all
      select r.name, y.year, r.month, 0, y.rnk
      from y
      join r on r.rnk = y.rnk - 1
      where not exists (
        select 1 from t where t.year = y.year and t.month = r.month and t.name = r.name
      )
    )
    select name, year, month, sales,
      nvl(sum(sales) over (partition by name order by year, month
        rows between unbounded preceding and 1 preceding), 0) as opening_bal,
      nvl(sum(sales) over (partition by name order by year, month
        rows between unbounded preceding and current row), 0) as closing_bal
    from r
    order by year, month, name;
    

    これも同じ結果になりますが、質問で期待される結果とは一致しません:

    NAME YEAR MONTH      SALES OPENING_BAL CLOSING_BAL
    ---- ---- ----- ---------- ----------- -----------
    A    2007 04             5           0           5
    A    2007 05             2           5           7
    A    2008 04             0           7           7
    A    2008 05             0           7           7
    B    2008 12             3           0           3
    A    2009 04             0           7           7
    A    2009 05             0           7           7
    C    2009 08            89           0          89
    B    2009 12            56           3          59
    B    2016 01            10          59          69
    A    2016 02             8           7          15
    D    2016 03            12           0          12
    A    2016 04             0          15          15
    E    2016 04            34           0          34
    A    2016 05             0          15          15
    C    2016 08             0          89          89
    B    2016 12             0          69          69
    

    y CTE(より意味のある名前を自由に使用してください!)は、元のデータからすべての異なる年を生成し、ランキングも追加します。したがって、2007年は1、2008年は2、2009年は3、2016年は4です。

    r 再帰CTEは、前年度の名前/月のデータに基づいて、実際のデータを売上ゼロのダミー行と組み合わせます。

    その再帰CTEが生成するものから、分析累積合計を実行して、開始/終了残高を追加できます。これは、ウィンドウ句を使用して、含める売上値を決定します。基本的に、期首残高と期末残高は、この時点までのすべての値の合計ですが、期首には現在の行は含まれません。



    1. SQL Server 2017:Linuxで利用可能な機能

    2. MS SQL ON DELETE CASCADE同じテーブルを指す複数の外部キー?

    3. Oracleのvarchar(max)に相当するものは何ですか?

    4. EF 4、部分クラスを追加する方法