ORA-00979 अभिव्यक्ति द्वारा एक समूह नहीं है


147

मुझे निम्नलिखित प्रश्न के साथ ORA-00979 मिल रहा है:

SELECT cr.review_sk, cr.cs_sk, cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
cs.cs_id, cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
and row_delete_date_time is null
and cr.review_sk = cf.review_wk (+)
and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;

मुझे ऐसा कोई उदाहरण नहीं मिला, जिसमें एक ही क्वेरी में ग्रुप BY और ORDER BY क्लॉस दोनों हों। मैंने एक-एक करके समूह से प्रत्येक फ़ील्ड को निकालने की कोशिश की, लेकिन मुझे अभी भी वही त्रुटि मिल रही है।

जवाबों:


232

आप के सभी स्तंभों करना होगा SELECTमें GROUP BYया जो किसी एकल मान के लिए परिणाम सेक (जैसे उन पर कार्यों का उपयोग MIN, MAXया SUM)।

ऐसा क्यों होता है यह समझने के लिए एक सरल उदाहरण: कल्पना कीजिए कि आपके पास इस तरह से एक डेटाबेस है:

FOO BAR
0   A
0   B

और तुम दौड़ो SELECT * FROM table GROUP BY foo। इसका मतलब यह है कि डेटाबेस 0को पूरा करने के लिए पहले कॉलम के परिणामस्वरूप एक एकल पंक्ति को वापस करना होगा , GROUP BYलेकिन अब इसमें barसे चुने गए दो मान हैं । आप किस परिणाम की उम्मीद करेंगे - Aया B? या डेटाबेस को एक से अधिक पंक्ति में लौटना चाहिए, अनुबंध का उल्लंघन GROUP BY?


7
नहीं, आपको उन्हें अपने आदेश में खंड द्वारा रखने की आवश्यकता नहीं है
Xaisoft

3
मैंने ORDER BY में दो कॉलम को GROUP BY में जोड़ने का प्रयास किया। वह काम किया। धन्यवाद!
थेरेसा

1
या इसे दूसरे तरीके से रखने के लिए: यदि आपके पास पहले से दो कॉलम और समूह हैं, तो इसका मतलब है कि आपके पास परिणाम पंक्ति के दूसरे कॉलम से कई मान होंगे। चूंकि केवल एक ही परिणाम पंक्ति है, लेकिन चुनने के लिए कई मान हैं, जिसमें से किसे DB वापस करना चाहिए? पहले यह ठोकर खाई?
एरोन दिगुल्ला

6
@AaronDigulla MySQL क्या करता है, और दुनिया खत्म नहीं हुई: p
क्रिस बेकर

1
मैं आंशिक रूप से सहमत हूं। लेकिन निम्नलिखित मामले को मानें: 4 कॉलम हैं: ए, बी, सी और डी। अब मैं एक समग्र कुंजी के रूप में (ए, बी, सी) सेट करता हूं। तब "ए, बी, अधिकतम (सी), डी ... ए, बी द्वारा समूह" का चयन अस्पष्ट नहीं है, क्योंकि ए, बी और सी के प्रत्येक संयोजन के लिए, डी पहले से ही परिभाषित है। फिर भी oracle अपना काम करने से मना कर देता है।
Ga

17

GROUP BYक्लॉज में उन सभी SELECTअभिव्यक्तियों को शामिल करें जो समूह फ़ंक्शन तर्क नहीं हैं।


9

बहुत खराब ओरेकल की सीमाएं ऐसी हैं। ज़रूर, समूह BY में कॉलम नहीं होने का परिणाम यादृच्छिक होगा, लेकिन कभी-कभी आप ऐसा चाहते हैं। सिली ऑरेकल, आप इसे MySQL / MSSQL में कर सकते हैं।

लेकिन वहाँ Oracle के लिए एक काम है:

जबकि निम्नलिखित लाइन काम नहीं करती है

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;

आप अपने कॉलम को दायरे में रखने के लिए Oracle को कुछ 0 की तरह निम्न के साथ ट्रिक कर सकते हैं, लेकिन इसके द्वारा समूह नहीं (मान लें कि ये संख्याएँ हैं, अन्यथा CONCAT का उपयोग करें)

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);

@GlennFromIowa ने मेरी छद्म तालिका को कड़ाई से परिभाषित नहीं किया है, और यह कि मैं अब 11g के साथ फर्म के लिए काम नहीं करता, मैं एक बेहतर उदाहरण प्रदान नहीं कर सकता, हालांकि जब मैंने आखिरी बार इसका परीक्षण किया था तो यह एक समस्या थी।
जोसेफ लस्ट

4
जिज्ञासा से बाहर बस एक उदाहरण है कि आप एक यादृच्छिक परिणाम कब चाहते हैं? मैं किसी भी कारण से नहीं सोच सकता कि आप FOO द्वारा समूह बनाना चाहते हैं और BAR के लिए एक यादृच्छिक पंक्ति प्राप्त करना चाहते हैं।
काइल ब्रिडेनस्टाइन

4

आप सहित के आधार पर समूहीकरण है, तो GROUP BYखंड, में किसी भी अभिव्यक्ति SELECTहै, जो समूह समारोह (या कुल समारोह या एकत्रित किया स्तंभ) के रूप में ऐसी नहीं है COUNT, AVG, MIN, MAX, SUMऔर इतने (पर सकल कार्यों की सूची ) में उपस्थित होना चाहिए GROUP BYखंड।

उदाहरण (सही तरीका) (यहां employee_idसमूह फ़ंक्शन (नॉन-एग्रीगेटेड कॉलम) नहीं है, इसलिए इसे इसमें दिखाई देना चाहिएGROUP BY । इसके विपरीत, योग (वेतन) एक समूह फ़ंक्शन (एग्रीगेटेड कॉलम) है, इसलिए इसे GROUP BYखंड में प्रदर्शित होने की आवश्यकता नहीं है। ।

   SELECT employee_id, sum(salary) 
   FROM employees
   GROUP BY employee_id; 

उदाहरण (गलत तरीका) (यहां employee_idसमूह फ़ंक्शन नहीं है और यह GROUP BYक्लॉज में प्रकट नहीं होता है , जो ORA-00979 त्रुटि को जन्म देगा।

   SELECT employee_id, sum(salary) 
   FROM employees;

सही करने के लिए आपको निम्नलिखित में से एक करने की आवश्यकता है :

  • में सूचीबद्ध सभी गैर-संकलित भाव शामिल SELECTमें खंड GROUP BYखंड
  • निकालें समूह (कुल) समारोह SELECTखंड से।

2

आपको निम्न कार्य करना चाहिए:

SELECT cr.review_sk, 
       cr.cs_sk, 
       cr.full_name,
       tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
       cs.cs_id, 
       cr.tracking_number
from review cr, cs, fact cf
where cr.cs_sk = cs.cs_sk
       and UPPER(cs.cs_id) like '%' || UPPER(i_cs_id) || '%'
       and row_delete_date_time is null
       and cr.review_sk = cf.review_wk (+)
       and cr.fact_type_code (+) = 183050
GROUP BY cr.review_sk, cr.cs_sk, cf.fact_date, cr.tracking_number, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;

1

समान त्रुटि तब भी आती है जब UPPER या LOWER कीवर्ड का चयन अभिव्यक्ति और समूह दोनों में अभिव्यक्ति द्वारा नहीं किया जाता है।

गलत :-

select a , count(*) from my_table group by UPPER(a) .

सही :-

select UPPER(a) , count(*) from my_table group by UPPER(a) .

1

समूह का उपयोग कुछ डेटा को एकत्र करने के लिए किया जाता है, जो कुल फ़ंक्शन के आधार पर होता है, और इसके अलावा आपको कॉलम या कॉलम लगाने की आवश्यकता होती है, जिसके लिए आपको समूह की आवश्यकता होती है।

उदाहरण के लिए:

select d.deptno, max(e.sal) 
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;

इससे विभागों को अधिकतम वेतन मिलेगा।

अब अगर हम d.deptnoसमूह से समूह को छोड़ देते हैं तो यह वही त्रुटि देगा।


1

अन्य उत्तरों के अतिरिक्त, यह त्रुटि तब हो सकती है जब खंड द्वारा किसी क्रम में असंगति हो। उदाहरण के लिए:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.