2016-05-04 12 views
1

これは、私が直面している問題の最小例です。列RAINFALLLOCATIONおよびDATETIMEを持つテーブルRAINが各都市の降雨のmmを示し、日付も記録しているとします。Oracleでの集計後にレコードが欠落している場合は、ゼロを記入してください

RAINFALL || LOCATION || DATETIME 
13  || Paris || 5 Jan 2016 
10  || London || 5 Jan 2016 
5  || New York || 5 Jan 2016 
7  || Paris || 13 Jan 2016 
24  || London || 13 Jan 2016 
4  || Paris || 21 Jan 2016 

私は都市ごとの雨のミリメートルを集約したいの週なので、私ができることは以下の通りです:

SELECT sum(RAINFALL) as RAINFALL, 
     to_char(DATETIME,'IW') as week_number, 
     LOCATION 
FROM RAIN 
group by to_char(DATETIME,'IW') , LOCATION; 

この意志出力何かのように:

10 01 London 
5 01 New York 
13 01 Paris 
24 02 London 
7 02 Paris 
4 03 Paris 

で少なくとも私の設定のために。私は実際にも出力にそれを希望することは次のとおりです。

10 01 London 
5 01 New York 
13 01 Paris 
24 02 London 
0 02 New York 
7 02 Paris 
4 03 Paris 
0 03 New York 
0 03 London 

違いは、私は何の記録もただ1つの都市がレコードを持っているそれぞれの週のために存在していない0を埋めるために、クエリをしたいということです。私は数週間は望んでいないが、レコードは存在しない。 Oracleでこれを行うにはどうすればよいですか?

この例では、降水量の合計はほとんど価値がないと理解していますが、私の質問を明確にするために、この最小限の例を作成しました。

答えて

0

チェックパーティション外部結合http://www.oracle-developer.net/display.php?id=312。 この機能は、Oracle 10g以降で使用できます。

次のクエリは、テーブルから異なる週をすべて選択し、同じテーブルで外部結合を分割します。

WITH b 
     AS (SELECT DISTINCT TO_CHAR (DATETIME, 'IW') AS week_number 
       FROM tmp_r) 
    SELECT NVL (SUM (RAINFALL), 0) AS RAINFALL, b.week_number, LOCATION 
    FROM b 
     LEFT OUTER JOIN tmp_r a 
      PARTITION BY (location) 
      ON (b.week_number = TO_CHAR (a.DATETIME, 'IW')) 
GROUP BY b.week_number, LOCATION 
ORDER BY b.week_number, location; 

上記のクエリは、あなたが探している出力を提供します。

+0

ありがとう、これはトリックです!あなたはtmp_rの代わりにRAINを入力したいかもしれませんが、残りはうまくいくようです! – Lamora

関連する問題