1

特定の月と年の分を提供する一連のデータから 12 か月の合計を取得しようとしています。多くの場合、1 か月間記録がありません。欠落している月を値にゼロ (0) を付けて表示し、それをロールアップするか、表示せずに、クエリでこれを 12 か月の範囲の一部として認識させる方法はありますか。以下のクエリは私が使用しようとしていたものですが、以前のレコードを取得するだけで、欠落している月は考慮されていません。以下のクエリは、一部の合計で少しずれているようには見えません。どんな援助でも大歓迎です。

    Select year
         , month
         , SUM(NVL(minutes, 0)) OVER (order by year,month rows between 11 preceding and current row) as total_minutes
    from
    (
    Select *  
    from test_table
    Order by year, month
    )
    Order by year desc , month desc

テストテーブルとデータを作成するためのSQLは次のとおりです。

    drop table test_table;
    create table test_table (
      month    number(2),
      year     number(4),
      minutes  number(4,2)
    );

    insert into test_table values ( 1, 2012, 3 );
    insert into test_table values ( 2, 2012, 3 );
    insert into test_table values ( 3, 2012, 3 );
    insert into test_table values ( 4, 2012, 4 );
    insert into test_table values ( 5, 2012, 5 );
    insert into test_table values ( 7, 2012, 5 );
    insert into test_table values ( 8, 2012, 5 );
    insert into test_table values ( 9, 2012, 5 );
    insert into test_table values (10, 2012, 4 );
    insert into test_table values (11, 2012, 3 );
    insert into test_table values (12, 2012, 3 );
    insert into test_table values ( 1, 2011, 3 );
    insert into test_table values ( 2, 2011, 3 );
    insert into test_table values ( 5, 2011, 5 );
    insert into test_table values ( 6, 2011, 5 );
    insert into test_table values ( 7, 2011, 5 );
    insert into test_table values ( 8, 2011, 5 );
    insert into test_table values ( 9, 2011, 5 );
    insert into test_table values (10, 2011, 4 );
    insert into test_table values (11, 2011, 3 );
    insert into test_table values (12, 2011, 3 );
    insert into test_table values ( 1, 2010, 3 );
    insert into test_table values ( 2, 2010, 3 );
    insert into test_table values ( 3, 2010, 3 );
    insert into test_table values ( 4, 2010, 4 );
    insert into test_table values ( 5, 2010, 4 );
    insert into test_table values ( 6, 2010, 5 );
    insert into test_table values ( 7, 2010, 5 );
    insert into test_table values (10, 2010, 4 );
    insert into test_table values (11, 2010, 4 );
    insert into test_table values (12, 2010, 3 );

    COMMIT;
4

2 に答える 2

0

アウタージョインを使用しましたが、必要な12か月のローリング範囲が得られませんでした。範囲と数値を正しく表示するには、ウィンドウ句を使用する必要がありました。

    with m_num as(
      select level as mn
       from dual
     connect by level <= 12
    )
    select year
         , mn
         , minutes
         , sum(minutes) over(order by year,mn rows between 11 preceding and current row) rt
    from ( select tt.Year
                , mn.mn
                , nvl(tt.minutes, 0)  minutes
            from test_table tt
            partition by (tt.year)
            right outer join m_num mn
              on (tt.month = mn.mn)
         )
    order by year desc, mn desc;
于 2012-11-13T18:07:07.847 に答える
0

数か月のギャップを埋めるためにpartition outer join、以下のクエリで(Oracle 10g広告以上)が使用されます。これらのゼロを実際に確認する必要がある場合は、元のクエリ書き換えSUM関数をとして保持できますSUM(NVL(minutes, 0)) OVER (partition by year order by year,month) as total_minutes

SQL> with m_num as(
  2    select level as mn
  3     from dual
  4   connect by level <= 12
  5  )
  6  select year
  7       , mn
  8       , minutes
  9       , sum(minutes) over(partition by year order by year, mn) rt
 10   from ( select tt.Year
 11               , mn.mn
 12               , nvl(tt.minutes, 0)  minutes
 13           from test_table tt
 14           partition by (tt.year)
 15           right outer join m_num mn
 16             on (tt.month = mn.mn)
 17        )
 18  order by year desc, mn desc
 19  ;


YEAR1         MN    MINUTES         RT
----- ---------- ---------- ----------
 2012         12          3         43
 2012         11          3         40
 2012         10          4         37
 2012          9          5         33
 2012          8          5         28
 2012          7          5         23
 2012          6          0         18
 2012          5          5         18
 2012          4          4         13
 2012          3          3          9
 2012          2          3          6
 2012          1          3          3
 2011         12          3         41
 2011         11          3         38
 2011         10          4         35
 2011          9          5         31
 2011          8          5         26
 2011          7          5         21
 2011          6          5         16
 2011          5          5         11
 2011          4          0          6
 2011          3          0          6
 2011          2          3          6
 2011          1          3          3
于 2012-11-08T21:54:22.647 に答える