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

केवल एक कॉलम द्वारा Oracle समूह

यहां लंबी टिप्पणी करें;

हाँ, आप ऐसा नहीं कर सकते। इसके बारे में सोचें... यदि आपके पास ऐसी तालिका है:

Col1 Col2 Col3
A    A    1
B    A    2
C    A    3

और आप केवल Col2 . के आधार पर समूह बना रहे हैं , जो एक पंक्ति में समूहबद्ध हो जाएगा... Col1 . का क्या होता है और Col3 ? उन दोनों में 3 अलग-अलग पंक्ति मान हैं। आपका DBMS उन्हें कैसे प्रदर्शित करेगा?

Col1 Col2 Col3
A?   A    1?
B?        2?
C?        3?

यही कारण है कि आपको सभी स्तंभों के आधार पर समूह बनाना होगा, या अन्यथा उन्हें एकत्रित या संयोजित करना होगा। (SUM() ,MAX() , MIN() , आदि..)

हमें दिखाएं कि आप परिणाम कैसे दिखाना चाहते हैं और मुझे यकीन है कि हम आपकी मदद कर सकते हैं।

संपादित करें - उत्तर:

सबसे पहले, अपना प्रश्न अपडेट करने के लिए धन्यवाद। आपकी क्वेरी में id नहीं है लेकिन आपके अपेक्षित परिणाम मिलते हैं, इसलिए मैं प्रत्येक के लिए अलग से उत्तर दूंगा।

बिना id

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

यदि आप बिना किसी समूह के अपनी क्वेरी चलाते हैं:

select col1, col2, col3 from table where col3='200'

आपको यह वापस मिल जाएगा:

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| 1        | some text 1 | 200   |
+----------+-------------+-------+

तो अब आप केवल col1 = 1 . देखना चाहते हैं एक बार पंक्ति। लेकिन ऐसा करने के लिए, आपको सभी . को रोल करना होगा कॉलम ऊपर, इसलिए आपका डीबीएमएस जानता है कि उनमें से प्रत्येक के साथ क्या करना है। यदि आप केवल col1 . द्वारा समूहबद्ध करने का प्रयास करते हैं , आप डीबीएमएस एक त्रुटि के माध्यम से करेंगे क्योंकि आपने यह नहीं बताया कि col2 में अतिरिक्त डेटा के साथ क्या करना है और col3 :

select col1, col2, col3 from table where col3='200' group by col1 --Errors

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   |
| 5        | some text 1 | 200   |
| ?        | some text 1?| 200?  |
+----------+-------------+-------+

यदि आप सभी 3 के द्वारा समूहित करते हैं, तो आपका DBMS पूरी पंक्तियों (जो आप चाहते हैं) को एक साथ समूहित करना जानता है, और केवल एक बार डुप्लिकेट पंक्तियों को प्रदर्शित करेगा:

select col1, col2, col3 from table where col3='200' group by col1, col2, col3

+----------+-------------+-------+
| col1     | col2        | col3  |
+----------+-------------+-------+
| 1        | some text 1 | 200   |
| 2        | some text 1 | 200   | --Desired results
| 5        | some text 1 | 200   |
+----------+-------------+-------+

id के साथ

अगर आप id देखना चाहते हैं , आपको अपना DBMS बताना होगा जो id प्रदर्शित करने के लिए। भले ही हम सभी स्तंभों के आधार पर समूहबद्ध हों, आपको अपने वांछित परिणाम नहीं मिलेंगे, क्योंकि id कॉलम प्रत्येक पंक्ति को अलग बना देगा (वे अब एक साथ समूह नहीं करेंगे):

select id, col1, col2, col3 from table where col3='200' group by id, col1, col2, col3

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   | --id = 2
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   | --id = 8
+--------+----------+-------------+-------+

इसलिए इन पंक्तियों को समूहबद्ध करने के लिए, हमें स्पष्ट रूप से यह बताना होगा कि id . के साथ क्या करना है एस। अपने वांछित परिणामों के आधार पर, आप id = 2 . चुनना चाहते हैं , जो कि न्यूनतम . है id , तो चलिए MIN() use का उपयोग करते हैं :

select MIN(id), col1, col2, col3 from table where col3='200' group by col1, col2, col3
--Note, MIN() is an aggregate function, so id need not be in the group by

जो आपके वांछित परिणाम देता है (id . के साथ) ):

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 3      | 2        | some text 1 | 200   |
| 7      | 5        | some text 1 | 200   |
+--------+----------+-------------+-------+

अंतिम विचार

आपकी समस्या की दो पंक्तियाँ ये थीं:

+--------+----------+-------------+-------+
| id     | col1     | col2        | col3  |
+--------+----------+-------------+-------+
| 2      | 1        | some text 1 | 200   |
| 8      | 1        | some text 1 | 200   |
+--------+----------+-------------+-------+

जब भी आप इन्हें हिट करें, तो बस इस बारे में सोचें कि आप प्रत्येक कॉलम को एक-एक करके क्या करना चाहते हैं। आपको सभी को संभालना होगा जब भी आप ग्रुपिंग या एग्रीगेट करते हैं तो कॉलम।

  • id , आप केवल id = 2 see देखना चाहते हैं , जो कि MIN() है
  • co1 , आप केवल विशिष्ट मान देखना चाहते हैं, इसलिए GROUP BY
  • col2 , आप केवल विशिष्ट मान देखना चाहते हैं, इसलिए GROUP BY
  • col3 , आप केवल विशिष्ट मान देखना चाहते हैं, इसलिए GROUP BY


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Oracle पृष्ठ पर अंक लगाना रणनीति

  2. INSERT ट्रिगर (Oracle) से पहले IF EXISTS (SELECT ...) का उपयोग करना

  3. Oracle क्वेरी .NET ऐप से धीमी (या विफल) है लेकिन SQL डेवलपर से तेज़ है

  4. Oracle sql क्वेरी तिथि के अनुसार लगातार रिकॉर्ड समूहित करने के लिए

  5. ऑरैकल में ट्रिगर और प्रक्रिया कैसे निष्पादित करें