ماڈیول اسباق (3/4)
GROUP BY کے ساتھ گروپ بندی
ماڈیول 2 میں آپ نے سیکھا کہ COUNT(*), AVG(...), SUM(...) سبھی کو کم کرتے ہیں
سنگل نتیجہ والی قطار کی قطار۔ لیکن اگر آپ اوسط تنخواہ چاہتے ہیں تو کیا ہوگا
ہر محکمے کے لیے، پوری کمپنی کے لیے نہیں؟ آپ ایک قطار per چاہتے ہیں۔
گروپ یہ GROUP BY کا کام ہے۔
نحو
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM table
GROUP BY grouping_column;انگریزی میں پڑھیں: "ان قطاروں کو ان گروپوں میں تقسیم کریں جن کی قدر ایک جیسی ہو۔
grouping_column، اور ہر گروپ کے لیے مجموعی حساب کریں"۔
-- 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 (Andrea Costa)۔
پڑھنے کے قابل ناموں کے لیے JOIN کے ساتھ
اکثر آپ department_id کے مطابق گروپ بنانا چاہتے ہیں لیکن اس کا نام دکھائیں
محکمہ آپ GROUP BY کو ایک JOIN کے ساتھ جوڑتے ہیں:
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 میں ہر کالم کا ہونا ضروری ہے:
- گروپنگ کالموں میں سے ایک (جیسے
department_id,d.name)، یا - ایک مجموعی فنکشن کے اندر (جیسے
AVG(salary),COUNT(*))۔
-- 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 لوگوں کے گروپ کے لیے؟ — کوئی ایک جواب نہیں ہے، اور
اس لیے انجن انکار کر دیتا ہے۔
اسے آزمائیں
ہر محکمے کے لیے حساب لگائیں کہ اس میں کتنے ملازمین ہیں۔ دو کالم واپس کریں: محکمہ کا نام (departments.name) اور ملازم کی گنتی۔ ایک قطار فی محکمہ۔
اشارہ دکھائیں۔
COUNT(*) کے ساتھ مجموعی اور d.name کے لحاظ سے گروپ۔ SELECT میں صرف گروپنگ کالم اور مجموعی ہونا ضروری ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
ہر محکمے (departments.name) کے لیے، اس کے ملازمین کی اوسط تنخواہ (AVG(تنخواہ)) کی گنتی کریں، جو کہ سب سے زیادہ سے کم تک ترتیب دی گئی ہے۔
اشارہ دکھائیں۔
AVG(e.salary) بطور مجموعی، GROUP BY d.name، ORDER BY اوسط DESC۔
3 کوششوں کے بعد حل دستیاب ہے۔