0

「月」と「年」、およびその他のデータの列を持つテーブルがあります。

テーブルのすべての行には、異なる値「月」と「年」があります。

ただし、一部の月と年の行は存在しません。

SQLクエリを作成したい(... where year in (2010, 2011, 2012) ...)、その結果、このSQLクエリは選択した年のすべての月を持ち、いくつかの月が存在しない場合はそれを追加します他のデータ列では 0 になります。

例: 入力: テーブル

data / month / year
+-----+---+------+
| 3.0 | 1 | 2011 |
| 4.3 | 3 | 2011 |
| 5.7 | 4 | 2011 |
| 2.2 | 5 | 2011 |
| 5.4 | 7 | 2011 |
+-----+---+------+

出力: SELECT ... WHERE year IN (2011)

+-----+----+------+
| 3.0 |  1 | 2011 |
|   0 |  2 | 2011 |
| 4.3 |  3 | 2011 |
| 5.7 |  4 | 2011 |
| 2.2 |  5 | 2011 |
|   0 |  6 | 2011 |
| 5.4 |  7 | 2011 |
|   0 |  8 | 2011 |
|   0 |  9 | 2011 |
|   0 | 10 | 2011 |
|   0 | 11 | 2011 |
|   0 | 12 | 2011 |
+-----+----+------+
4

3 に答える 3

3

パーティション外部結合を試してください:

SELECT
  NVL(T.DATA, 0) DATA,
  F.MONTH,
  T.YEAR
FROM <your_table> T
PARTITION BY(T.YEAR)
RIGHT JOIN (SELECT LEVEL MONTH FROM DUAL CONNECT BY LEVEL <= 12) F ON T.MONTH = F.MONTH

最後に WHERE 句を追加するか、その定義を使用してビューを作成し、それに対してクエリを実行します。

于 2012-10-18T07:40:41.220 に答える
2
select datecol, 
       nvl(val,0),
       to_char(d.date_col,'MM') month,
       to_char(d.date_col,'yyyy') year
from(
    select add_months('1-Jan-2011',level-1) as datecol
    from dual connect by level <= 12
     ) d
left join(
    select sum(val) as val, month, year
    from your_table
    group by month, year
    ) S
on (to_char(d.date_col,'MM') = s.month and to_char(d.date_col,'yyyy') = s.year)
于 2012-10-18T07:33:56.547 に答える
0
select nvl(t.data, 0), x.month, nvl(t.year, <your_year>) as year
  from <your_table> t,
       (select rownum as month from dual connect by level < 13) x
 where (t.year is null or t.year = <your_year>)
   and t.month(+) = x.month
 order by x.month
于 2012-10-18T09:02:27.880 に答える