مرکزی مواد پر جائیں
ماڈیول 3 · سبق 3 از 4کورس میں 11/57~10 min
ماڈیول اسباق (3/4)

GROUP BY کے ساتھ گروپ بندی

ماڈیول 2 میں آپ نے سیکھا کہ COUNT(*), AVG(...), SUM(...) سبھی کو کم کرتے ہیں سنگل نتیجہ والی قطار کی قطار۔ لیکن اگر آپ اوسط تنخواہ چاہتے ہیں تو کیا ہوگا ہر محکمے کے لیے، پوری کمپنی کے لیے نہیں؟ آپ ایک قطار per چاہتے ہیں۔ گروپ یہ 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 (Andrea Costa)۔

پڑھنے کے قابل ناموں کے لیے 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.name کے لحاظ سے گروپ۔ SELECT میں صرف گروپنگ کالم اور مجموعی ہونا ضروری ہے۔

3 کوششوں کے بعد حل دستیاب ہے۔

ورزش کا جائزہ لیں۔

ورزش#sql.m3.l3.e2
کوششیں: 0لوڈ ہو رہا ہے…

ہر محکمے (departments.name) کے لیے، اس کے ملازمین کی اوسط تنخواہ (AVG(تنخواہ)) کی گنتی کریں، جو کہ سب سے زیادہ سے کم تک ترتیب دی گئی ہے۔

ایڈیٹر لوڈ ہو رہا ہے…
اشارہ دکھائیں۔

AVG(e.salary) بطور مجموعی، GROUP BY d.name، ORDER BY اوسط DESC۔

3 کوششوں کے بعد حل دستیاب ہے۔