हमारे पास नीचे की तरह एक टेबल है:

data we have

मैं महीने के हिसाब से "टाइप" कॉलम की संख्या और एक और कॉलम को वर्गीकृत करना चाहता हूं जो दिखाता है कि वे कितनी बार दोहराए गए हैं। (हमें 12 x प्रकार की संख्या की आवश्यकता है (यहां हमारे पास तीन प्रकार हैं (1,2,4))। मैं चाहता हूं कि मेरा परिणाम नीचे जैसा हो:

the result we need

महीने के लिए कोई रिकॉर्ड नहीं होने पर भी मुझे रिकॉर्ड चाहिए (चित्र में हरा 0)

क्या मुझे एक ही टेबल पर दो बार ज्वाइन कमांड का उपयोग करने की आवश्यकता है?

-2
andrew 28 मार्च 2017, 00:22

2 जवाब

सबसे बढ़िया उत्तर

आपको अपनी तालिका के साथ एक cross join (विभिन्न प्रकार और महीनों के सभी संभावित संयोजन उत्पन्न करने के लिए) और एक left join की आवश्यकता होगी और अंत में आवश्यक गणना प्राप्त करने के लिए एकत्रित करना होगा।

select m.month,
    x.type,
    count(t.type)
from (
    select to_char(add_months(sysdate, level), 'Mon') as month
    from dual connect by level <= 12
    ) m
cross join (
    select distinct type
    from your_table
    ) x
left join your_table t on m.month = to_char(t.session_date, 'Mon')
    and x.type = t.type
group by m.month,
    x.type
order by x.type, to_date(m.month, 'Mon');

डेमो

0
Gurwinder Singh 28 मार्च 2017, 01:22

आपको पहले सभी प्रकार के मानों की पूरी सूची तैयार करनी होगी। यदि आपके पास किसी भिन्न तालिका की विदेशी कुंजी नहीं है, तो आप इसे इस तरह कर सकते हैं।

select distinct type
from the_table

आप स्पष्ट रूप से वर्ष की परवाह किए बिना एक महीने के लिए सभी नंबरों को एक पंक्ति में रखना चाहते हैं, इसलिए आपको इसमें शामिल होने के लिए 12 पंक्तियों की एक और सूची की आवश्यकता है:

select level
from dual
connect by level <= 12;

अब इन दोनों को एक साथ रखा जा सकता है और आपकी मेज के खिलाफ जोड़ा जा सकता है:

with all_types as (
  select distinct type
  from the_table
), all_months (month_nr) as (
  select level
  from dual
  connect by level <= 12
)
select at.type, am.month_nr, count(*)
from all_types at
  cross join all_months am
  left join the_table t 
         on t.type = at.type 
        and extract(month from t.session_date) = am.month_nr
group by at.type, am.month_nr
order by at.type, am.month_nr;

यह महीने को एक संख्या के रूप में प्रदर्शित करेगा, यदि आपको पाठ के रूप में इसकी आवश्यकता है, तो अंतिम चयन की चयन सूची में केवल am.month_nr के बजाय to_char(to_date(am.month_nr, 'mm'), 'Mon') as month का उपयोग करें।

0
a_horse_with_no_name 28 मार्च 2017, 00:44