这是我面临的问题的最小例子。想象一下,我们有一个表RAIN
,其中包含RAINFALL
,LOCATION
和DATETIME
列,表示每个城市的降雨量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中做到这一点?
据我所知,在这个例子中总结降雨量的价值不大,因为我们每个城市每周都有价值,但我创造了这个最小的例子,希望能让我的问题清楚。
答案 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;
上面的查询将给出您要查找的输出。