முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 3 · பாடம் 3 இன் 4பாடத்திட்டத்தில் 11/57~10 min
தொகுதி பாடங்கள் (3/4)

GROUP மூலம் குழுவாக்குதல்

தொகுதி 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 ஒரு வெளிப்படையான பிழையை வழங்குகிறது ("நெடுவரிசை GROUP BY இல் தோன்ற வேண்டும் உட்பிரிவு அல்லது மொத்த செயல்பாட்டில் பயன்படுத்தப்படும்"). ஆரம்ப வாரங்களில் இது பொதுவானது தவறு: நீங்கள் அதைக் கண்டால், நிறுத்தி உங்களை நீங்களே கேட்டுக்கொள்ளுங்கள் "இதன் மதிப்பு என்ன first_name 3 பேர் கொண்ட குழுவிற்கு?" — ஒரே பதில் இல்லை, மற்றும் அதனால்தான் இயந்திரம் மறுக்கிறது.

முயற்சி செய்து பாருங்கள்

உடற்பயிற்சி#sql.m3.l3.e1
முயற்சிகள்: 0ஏற்றுகிறது…

ஒவ்வொரு துறைக்கும், அதில் எத்தனை பணியாளர்கள் உள்ளனர் என்பதைக் கணக்கிடுங்கள். இரண்டு நெடுவரிசைகளை அனுப்பவும்: துறையின் பெயர் (departments.name) மற்றும் பணியாளர் எண்ணிக்கை. ஒரு துறைக்கு ஒரு வரிசை.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

COUNT(*) உடன் ஒருங்கிணைத்து d.பெயர் மூலம் குழு. SELECT இல் குழுவாக்கும் நெடுவரிசையும் மொத்தமும் மட்டுமே இருக்க வேண்டும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்

மதிப்பாய்வு பயிற்சி

உடற்பயிற்சி#sql.m3.l3.e2
முயற்சிகள்: 0ஏற்றுகிறது…

ஒவ்வொரு துறைக்கும் (departments.name), அதன் ஊழியர்களின் சராசரி சம்பளத்தை (AVG(சம்பளம்)) கணக்கிடவும், அதிகபட்சம் முதல் குறைந்த வரை வரிசைப்படுத்தப்பட்டுள்ளது.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

AVG(e.salary) மொத்தமாக, d.பெயர் மூலம் குழு, சராசரி DESC மூலம் ஆர்டர்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்