在Oracle

时间:2016-05-04 08:53:38

标签: oracle

这是我面临的问题的最小例子。想象一下,我们有一个表RAIN,其中包含RAINFALLLOCATIONDATETIME列,表示每个城市的降雨量mm,并记录日期。

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

不同之处在于我希望查询填写0,其中每周都没有记录,即使只有一个城市有记录。我不想要几个星期,因为没有记录。我怎样才能在Oracle中做到这一点?

据我所知,在这个例子中总结降雨量的价值不大,因为我们每个城市每周都有价值,但我创造了这个最小的例子,希望能让我的问题清楚。

1 个答案:

答案 0 :(得分: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;

上面的查询将给出您要查找的输出。