मुख्य सामग्री पर जाएं
मॉड्यूल 3 · पाठ 3 का 4पाठ्यक्रम में 11/57~10 min
मॉड्यूल पाठ (3/4)

ग्रुप बाय के साथ ग्रुपिंग

मॉड्यूल 2 में आपने सीखा कि COUNT(*), AVG(...), SUM(...) सभी को कम करते हैं एकल परिणाम पंक्ति में पंक्तियाँ। लेकिन क्या होगा यदि आप औसत वेतन चाहते हैं प्रत्येक विभाग के लिए, पूरी कंपनी के लिए नहीं? आप एक पंक्ति प्रति चाहते हैं समूह. यही GROUP BY का काम है।

वाक्यविन्यास

SQL
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM   table
GROUP BY grouping_column;

अंग्रेजी में पढ़ें: "पंक्तियों को उन समूहों में विभाजित करें जिनका मान समान है grouping_column, और प्रत्येक समूह के लिए कुल की गणना करें"।

SQL
-- Average salary per department:
SELECT department_id, AVG(salary) AS average
FROM   employees
GROUP BY department_id;

परिणाम में प्रत्येक विशिष्ट department_id के लिए एक पंक्ति पाई गई employees. आपको 5 पंक्तियाँ मिलेंगी: 4 विभागों में से प्रत्येक के लिए एक (1, 2, 3, 4) और NULL (एंड्रिया कोस्टा) के लिए एक।

पठनीय नामों के लिए JOIN के साथ

अक्सर आप department_id द्वारा समूह बनाना चाहते हैं लेकिन नाम दिखाते हैं विभाग. आप GROUP BY को JOIN के साथ जोड़ते हैं:

SQL
SELECT d.name AS department,
       COUNT(*)    AS count,
       AVG(e.salary) AS average_salary
FROM   employees   AS e
JOIN   departments AS d ON e.department_id = d.id
GROUP BY d.name
ORDER BY count DESC;

यह एक पूर्ण विकसित बिजनेस इंटेलिजेंस क्वेरी है: तीन पंक्तियों में आपको बताता है कि प्रत्येक विभाग में कितने कर्मचारी हैं और वे कितना कमाते हैं औसत, सबसे बड़े से सबसे छोटे तक क्रमबद्ध।

सुनहरा नियम

जब आप GROUP BY का उपयोग करते हैं, तो SELECT में प्रत्येक कॉलम होना चाहिए:

  1. समूहीकरण कॉलम में से एक (जैसे department_id, d.name), या
  2. एक समग्र फ़ंक्शन के अंदर (जैसे AVG(salary), COUNT(*))।
SQL
-- ERROR: first_name is neither in GROUP BY nor inside an aggregate
SELECT department_id, first_name, AVG(salary)
FROM   employees
GROUP BY department_id;

PostgreSQL एक स्पष्ट त्रुटि देता है ("कॉलम ग्रुप BY में दिखना चाहिए खंड या समग्र फ़ंक्शन में उपयोग किया जाना चाहिए")। शुरुआती सप्ताहों में यह आम बात है गलती: यदि आप इसे देखें, तो रुकें और अपने आप से पूछें "इसका मूल्य क्या है first_name 3 लोगों के समूह के लिए?" - कोई एक उत्तर नहीं है, और इसीलिए इंजन मना कर देता है।

इसे अजमाएं

व्यायाम#sql.m3.l3.e1
प्रयास: 0लोड हो रहा है...

प्रत्येक विभाग के लिए, गणना करें कि इसमें कितने कर्मचारी हैं। दो कॉलम लौटाएँ: विभाग का नाम (विभाग का नाम) और कर्मचारी संख्या। प्रति विभाग एक पंक्ति.

संपादक लोड हो रहा है...
संकेत दिखाएँ

COUNT(*) के साथ एकत्र करें और d.name के अनुसार समूह बनाएं। चयन में केवल समूहीकरण कॉलम और समुच्चय शामिल होना चाहिए।

3 प्रयासों के बाद समाधान उपलब्ध है

व्यायाम की समीक्षा करें

व्यायाम#sql.m3.l3.e2
प्रयास: 0लोड हो रहा है...

प्रत्येक विभाग (विभाग का नाम) के लिए, उसके कर्मचारियों के औसत वेतन (एवीजी (वेतन)) की गणना करें, जो उच्चतम से निम्नतम तक क्रमबद्ध हो।

संपादक लोड हो रहा है...
संकेत दिखाएँ

कुल योग के रूप में औसत(ई.वेतन), डी.नाम के अनुसार समूह, औसत डीईएससी के अनुसार आदेश।

3 प्रयासों के बाद समाधान उपलब्ध है