Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

Oracle:सभी महीनों पर डेटा प्राप्त करें, 0 यदि कोई डेटा नहीं है

एक्साइटिंग उत्तरों के समान, लेकिन यह:

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 . है मान (यह मानते हुए कि मूल्य के बजाय लागत केंद्र की तरह कुछ का प्रतिनिधित्व कर रहा है; यह बताना थोड़ा कठिन है कि क्या है) और आप सबक्वेरी के बजाय इसका उपयोग कर सकते हैं।

SQL Fiddle

यह भी ध्यान दें कि यदि आप कोई फ़िल्टर जोड़ना चाहते हैं, उदा. डेटा को किसी विशेष वर्ष तक सीमित करने के लिए, आपको 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 


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. IF ELSE स्टेटमेंट जोड़ें

  2. 'MSDAORA.1' प्रदाता स्थानीय मशीन पर पंजीकृत नहीं है

  3. पैकेज बॉडी के भीतर निजी फ़ंक्शन को कॉल करना

  4. टेबलस्पेस पुनर्स्थापित करें USERS काम नहीं करता है। ओरेकल बैकअप

  5. Oracle SQL Regex अपेक्षित परिणाम नहीं लौटा रहा है