एक्साइटिंग उत्तरों के समान, लेकिन यह:
select months.month, mv.mycost, coalesce(mv.mynumber, 0) as mynumber
from (
select to_char(date '1970-01-01'
+ numtoyminterval(level - 1, 'month'), 'mm') as month
from dual
connect by level <= 12) months
left join myoracle_mv mv
on mv.month = months.month
order by months.month, mv.mycost, mv.mynumber;
यह आपके द्वारा पोस्ट किए गए डेटा के साथ देता है:
MONTH MYCOST MYNUMBER
----- ------ ----------
01 AAA 3777.24
01 BBB 18811
01 CCC 3845.47
02 AAA 49973.12
02 BBB 29872.67
02 CCC 3050.54
03 AAA 4049.91
03 BBB 29068.55
03 CCC 3784.44
03 DDD 107.07
04 AAA 469.485
04 BBB 264957.8
04 CCC 799.73
04 DDD 181.78
05 AAA 5872.22
05 BBB 67673
05 CCC 124884.2
05 DDD 110.09
06 AAA 65837.71
06 BBB 855.02
06 CCC 5157.24
06 DDD 18016.19
07 AAA 566.23
07 BBB 5226.1
07 CCC 19184.78
07 DDD 1772.95
08 AAA 18432.95
08 BBB 2663.24
08 CCC 2280.05
08 DDD 63.32
09 0
10 0
11 0
12 AAA 4337.75
12 BBB 5490.58
35 rows selected
अगर आप चाहते हैं कि mynumber
. में एक शून्य दिखाई दे कॉलम तो आप इसे बना सकते हैं:
select months.month, mv.mycost, coalesce(mv.mynumber, 0) as mynumber
जो देता है:
...
08 DDD 63.32
09 0
10 0
11 0
12 AAA 4337.75
...
जाफर के जवाब पर टिप्पणियों से ऐसा लगता है कि शायद आप अपने दम पर इसे प्राप्त कर लेंगे, लेकिन आप सभी के लिए शून्य मान चाहते हैं mycost
सभी महीनों के लिए मूल्य। यदि ऐसा है तो आपको mycost
. के लिए संभावित मानों की सूची प्राप्त करने की आवश्यकता है और बाहरी भी उसमें शामिल हों। यह उन सभी मूल्यों को ले रहा है जो पहले से ही एमवी में हैं:
select months.month, costs.mycost, coalesce(mv.mynumber, 0) as mynumber
from (
select to_char(date '1970-01-01'
+ numtoyminterval(level - 1, 'month'), 'mm') as month
from dual
connect by level <= 12) months
cross join (
select distinct mycost
from myoracle_mv) costs
left join myoracle_mv mv
on mv.month = months.month
and mv.mycost = costs.mycost
order by months.month, costs.mycost, mv.mynumber;
और देता है:
MONTH MYCOST MYNUMBER
----- ------ ----------
01 AAA 3777.24
01 BBB 18811
01 CCC 3845.47
01 DDD 0
02 AAA 49973.12
02 BBB 29872.67
02 CCC 3050.54
02 DDD 0
03 AAA 4049.91
03 BBB 29068.55
03 CCC 3784.44
03 DDD 107.07
04 AAA 469.485
04 BBB 264957.8
04 CCC 799.73
04 DDD 181.78
05 AAA 5872.22
05 BBB 67673
05 CCC 124884.2
05 DDD 110.09
06 AAA 65837.71
06 BBB 855.02
06 CCC 5157.24
06 DDD 18016.19
07 AAA 566.23
07 BBB 5226.1
07 CCC 19184.78
07 DDD 1772.95
08 AAA 18432.95
08 BBB 2663.24
08 CCC 2280.05
08 DDD 63.32
09 AAA 0
09 BBB 0
09 CCC 0
09 DDD 0
10 AAA 0
10 BBB 0
10 CCC 0
10 DDD 0
11 AAA 0
11 BBB 0
11 CCC 0
11 DDD 0
12 AAA 4337.75
12 BBB 5490.58
12 CCC 0
12 DDD 0
48 rows selected
लेकिन उम्मीद है कि आपके पास एक और टेबल है जिसमें संभव mycost
. है मान (यह मानते हुए कि मूल्य के बजाय लागत केंद्र की तरह कुछ का प्रतिनिधित्व कर रहा है; यह बताना थोड़ा कठिन है कि क्या है) और आप सबक्वेरी के बजाय इसका उपयोग कर सकते हैं।
यह भी ध्यान दें कि यदि आप कोई फ़िल्टर जोड़ना चाहते हैं, उदा. डेटा को किसी विशेष वर्ष तक सीमित करने के लिए, आपको left join
. में ऐसा करना होगा खंड, where
. के रूप में नहीं क्लॉज, या आप बाहरी जुड़ाव को आंतरिक में वापस कर देंगे। उदाहरण के लिए, इसे जोड़ना
:
where mv.year = 2011
इसका मतलब यह होगा कि आपको केवल दो पंक्तियाँ मिली हैं:
MONTH MYCOST MYNUMBER
----- ------ ----------
12 AAA 4337.75
12 BBB 5490.58
लेकिन अगर आप बाहरी जुड़ाव पर किसी अन्य शर्त से बने हैं आपको अभी भी 48 पंक्तियाँ वापस मिलेंगी, जिनमें से 46 में शून्य और दो के ऊपर मान हैं:
...
left join myoracle_mv mv
on mv.month = months.month
and mv.mycost = costs.mycost
and mv.year = 2011
order by months.month, costs.mycost, mv.mynumber;
...
11 CCC 0
11 DDD 0
12 AAA 4337.75
12 BBB 5490.58
12 CCC 0
12 DDD 0
48 rows selected