SQL क्वेरी में, हम समूह का उपयोग समुच्चय को लागू करने के लिए खंड द्वारा करते हैं।
- लेकिन क्लॉज द्वारा समूह के साथ कॉलम नाम के बजाय संख्यात्मक मान का उपयोग करने के पीछे क्या उद्देश्य है? उदाहरण के लिए: समूह 1 से।
SQL क्वेरी में, हम समूह का उपयोग समुच्चय को लागू करने के लिए खंड द्वारा करते हैं।
जवाबों:
यह वास्तव में IMHO करने के लिए वास्तव में एक बुरी बात है, और यह अधिकांश अन्य डेटाबेस प्लेटफार्मों में समर्थित नहीं है।
लोग इसे करते हैं:
इसके खराब होने के कारण:
यह स्व-दस्तावेजीकरण नहीं है - किसी को समूह का पता लगाने के लिए चयन सूची को पार्स करने जाना है। यह वास्तव में SQL सर्वर में थोड़ा और स्पष्ट होगा, जो चरवाहे का समर्थन नहीं करता है जो जानता है कि क्या-क्या-क्या होता है जैसे MySQL करता है।
यह भंगुर है - कोई व्यक्ति चयन सूची में आता है और बदल जाता है क्योंकि व्यावसायिक उपयोगकर्ता एक अलग रिपोर्ट आउटपुट चाहते थे, और अब आपका आउटपुट गड़बड़ है। यदि आपने GROUP BY में कॉलम नामों का उपयोग किया था, तो SELECT लिस्ट में ऑर्डर अप्रासंगिक होगा।
SQL सर्वर ORDER का समर्थन करता है [क्रम]; यहाँ इसके उपयोग के खिलाफ कुछ समानांतर तर्क दिए गए हैं:
MySQL आपको GROUP BY
उपनामों के साथ करने की अनुमति देता है ( स्तंभ के साथ समस्याएँ )। यह बेहतर होगा कि GROUP BY
संख्याओं के साथ कर रहे हैं ।
column number
SQL आरेखों में है । एक पंक्ति कहती है: दिए गए कॉलम नंबर, या एक अभिव्यक्ति द्वारा परिणाम को सॉर्ट करता है। यदि अभिव्यक्ति एकल पैरामीटर है, तो मान को स्तंभ संख्या के रूप में व्याख्या की जाती है। नकारात्मक स्तंभ संख्याएँ क्रम क्रम को उलट देती हैं।Google के पास इसका उपयोग करने के कई उदाहरण हैं और कई लोगों ने इसका उपयोग करना बंद कर दिया है।
आप के साथ ईमानदारी से कहूं तो मैं के लिए स्तंभ संख्या इस्तेमाल नहीं किया है ORDER BY
और GROUP BY
1996 के बाद से (मैं समय पर ओरेकल PL / SQL विकास कर रहा था)। स्तंभ संख्याओं का उपयोग करना वास्तव में पुराने समय के लिए है और पिछड़ी संगतता ऐसे डेवलपर्स को MySQL और अन्य RDBMS का उपयोग करने की अनुमति देती है जो अभी भी इसके लिए अनुमति देते हैं।
मामले के नीचे विचार करें:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Applications | 1 |
| 2016-05-31 | Apps | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-05-31 | Videos | 1 |
| 2016-06-01 | Apps | 3 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Videos | 2 |
| 2016-06-01 | Apps | 2 |
+------------+--------------+-----------+
आपको एप्लिकेशन और एप्लिकेशन को एक ही सेवा मानते हुए प्रति दिन प्रति सेवा डाउनलोड की संख्या का पता लगाना है। द्वारा समूहीकृत करने के date, services
परिणामस्वरूप Apps
और Applications
अलग-अलग सेवाओं पर विचार किया जाएगा ।
उस स्थिति में, क्वेरी होगी:
select date, services, sum(downloads) as downloads
from test.zvijay_test
group by date,services
और आउटपुट:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Apps | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Apps | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
लेकिन यह वह नहीं है जो आप चाहते हैं कि एप्लिकेशन और एप्लिकेशन को समूहबद्ध किया जाए। तो हम क्या कर सकते हैं?
एक तरह से बदलने के लिए है Apps
के साथ Applications
एक का उपयोग कर CASE
अभिव्यक्ति या IF
समारोह और फिर उन्हें के रूप में सेवाओं पर समूहीकरण:
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,services
लेकिन यह अभी भी सेवाओं को अलग-अलग सेवाओं के रूप में मानता है Apps
और Applications
पहले जैसा ही आउटपुट देता है:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Applications | 2 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 4 |
| 2016-06-01 | Applications | 5 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
स्तंभ संख्या पर समूह बनाना आपको डेटा को किसी अन्य स्तंभ पर समूहित करने की अनुमति देता है।
select
date,
if(services='Apps','Applications',services) as services,
sum(downloads) as downloads
from test.zvijay_test
group by date,2;
और इस प्रकार आप नीचे दिए गए वांछित आउटपुट दे रहे हैं:
+------------+--------------+-----------+
| date | services | downloads |
+------------+--------------+-----------+
| 2016-05-31 | Applications | 4 |
| 2016-05-31 | Videos | 2 |
| 2016-06-01 | Applications | 9 |
| 2016-06-01 | Videos | 2 |
+------------+--------------+-----------+
मैंने कई बार पढ़ा है कि यह प्रश्नों को लिखने का एक आलसी तरीका है या किसी अन्य कॉलम का समूह MySQL में काम नहीं करता है, लेकिन यह अलियास कॉलम पर समूह बनाने का तरीका है।
यह प्रश्नों को लिखने का पसंदीदा तरीका नहीं है, इसका उपयोग केवल तब करें जब आपको वास्तव में किसी अन्य स्तंभ पर समूह बनाने की आवश्यकता हो।
इसका उपयोग करने का कोई वैध कारण नहीं है। यह केवल एक आलसी शॉर्टकट है जिसे विशेष रूप से कुछ हार्ड-प्रेशर डेवलपर के लिए मुश्किल से बनाया गया है ताकि वह अपने ग्रुपिंग का पता लगा सके या बाद में छांट सके या किसी को कॉलम क्रम में बदलाव करने पर कोड को गलत तरीके से विफल होने दे सके। अपने साथी डेवलपर्स का ध्यान रखें और ऐसा न करें।
यह मेरे लिए काम किया है। कोड समूहों को 5 समूहों तक पंक्तियों में विभाजित करता है।
SELECT
USR.UID,
USR.PROFILENAME,
(
CASE
WHEN MOD(@curRow, 5) = 0 AND @curRow > 0 THEN
@curRow := 0
ELSE
@curRow := @curRow + 1
/*@curRow := 1*/ /*AND @curCode := USR.UID*/
END
) AS sort_by_total
FROM
SS_USR_USERS USR,
(
SELECT
@curRow := 0,
@curCode := ''
) rt
ORDER BY
USR.PROFILENAME,
USR.UID
परिणाम निम्नानुसार होगा
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2;
SELECT dep_month,dep_day_of_week,dep_date,COUNT(*) AS flight_count FROM flights GROUP BY 1,2,3;
ऊपर दिए गए प्रश्नों पर विचार करें: 1 समूह के समूह का मतलब पहले कॉलम से समूह और 1,2 का समूह पहले और दूसरे कॉलम का समूह और समूह का 1,2,3 का मतलब पहले दूसरे और तीसरे कॉलम का समूह। उदाहरण के लिए:
यह छवि 1,2 द्वारा समूहीकृत पहले दो स्तंभों को दिखाती है, यह गिनती खोजने के लिए dep_date के विभिन्न मूल्यों पर विचार नहीं कर रहा है (गणना करने के लिए पहले दो स्तंभों के सभी विशिष्ट संयोजनों को ध्यान में रखा गया है) जबकि दूसरी क्वेरी का परिणाम यह है
छवि। यहां यह सभी पहले तीन कॉलमों पर विचार कर रहा है और गिनती को खोजने के लिए अलग-अलग मूल्य हैं, यह पहले तीन कॉलमों को समूहीकृत कर रहा है (गणना करने के लिए पहले तीन कॉलमों के सभी विशिष्ट संयोजनों को ध्यान में रखा जाता है)।
order by 1
पर बैठकर ही इस्तेमाल करेंmysql>
। कोड में, उपयोग करेंORDER BY id ASC
। मामले पर ध्यान दें, स्पष्ट फ़ील्ड नाम, और स्पष्ट क्रम निर्देश।