【发布时间】:2013-07-22 16:57:34
【问题描述】:
我有一个 Mview,它通过 idNumber 和 Month 带来数据组。因此,如果特定月份没有数据,我想显示 0。这是我的查询:
select MonthName, myCost, myNumber
from
(
select MONTH mm, myCost, myNumber
from myOracle_mv
) myTotals,
(
select to_char(date '2012-12-1' + numtoyminterval(level,'month'), 'mm') MonthName
from dual
connect by level <= 12
) ALLMONTHS
where mm = MonthName
所以我期待:
Month Number Data
-----------------------
1 abc123 4444
2 0
3 abc123 4444
4 abc123 4444
5 0
6 abc123 4444
7 abc123 4444
8 0
9 abc123 4444
10 abc123 4444
11 0
12 abc123 4444
相反,我仍然得到:
1 abc123 4444
3 abc123 4444
4 abc123 4444
6 abc123 4444
7 abc123 4444
9 abc123 4444
10 abc123 4444
12 abc123 4444
有什么想法吗?
谢谢!
编辑:感谢您的回答。我的查询中确实有外连接,但忘记输入,因为我正集中精力更改表/列的名称。
所以是的,我已经尝试了 OUTER JOIN,但仍然没有得到预期的结果。非常感谢任何反馈。
编辑:这是 myOracle_MV 上的数据:
3777.24 AAA 1 2012
49973.12 AAA 2 2012
4049.91 AAA 3 2012
469.485 AAA 4 2012
5872.22 AAA 5 2012
65837.71 AAA 6 2012
566.23 AAA 7 2012
18432.95 AAA 8 2012
4337.75 AAA 12 2011
18811 BBB 1 2012
29872.67 BBB 2 2012
29068.55 BBB 3 2012
264957.8 BBB 4 2012
67673 BBB 5 2012
855.02 BBB 6 2012
5226.1 BBB 7 2012
2663.24 BBB 8 2012
5490.58 BBB 12 2011
3845.47 CCC 1 2012
3050.54 CCC 2 2012
3784.44 CCC 3 2012
799.73 CCC 4 2012
124884.2 CCC 5 2012
5157.24 CCC 6 2012
19184.78 CCC 7 2012
2280.05 CCC 8 2012
107.07 DDD 3 2012
181.78 DDD 4 2012
110.09 DDD 5 2012
18016.19 DDD 6 2012
1772.95 DDD 7 2012
63.32 DDD 8 2012
【问题讨论】:
-
外连接会得到什么结果;您是否以正确的方式进行操作(在这种情况下是右外,而不是左外)?
-
嗨@AlexPoole 我已经尝试了这里发布的所有建议,他们发布的方式,更改了连接顺序,表格顺序等。什么都没有。我真的不明白为什么它不起作用。我的 myOracle_mv 是一个 MView,这会有所不同吗?
-
你可以在 SQL Fiddle 上看到这些工作; your original、schurik's answer 和 Justin's answer。所以有些事情你没有告诉我们。
where子句中是否还有其他破坏外连接的内容?这在使用 Justin 的 ANSI 语法时最为明显。不,它是一个 MV 是无关紧要的,它就像一张桌子一样对待,这是重点的一部分。 -
@AlexPoole 他需要为每个
myNumber值重复 12 个月(AAA 为 12 次/月,BBB 为另一个...等),我猜每年的值需要 12 个月.检查我的答案的评论,@user1270446 如果我错了,请纠正我 -
@AlexPoole 感谢您抽出宝贵时间 Alex。我从表中发布数据。现在我没有在查询中添加任何代码,虽然我以后可能会这样做。但贾法尔在查看数据后是正确的。我真的认为这并不重要,因为我只需要将月份设为 0。我在 MS SQL 中有一个类似的查询,我将系统中的月份放入 TEMP 表中并加入它,它就可以工作了。所以我在 Oracle 中尝试了类似的工作。谢谢!