ماڈیول اسباق (4/4)
فلٹرنگ گروپس: ہونا
ایک بار جب آپ کے پاس فی گروپ (پچھلا سبق) نتیجہ آجائے، تو آپ اکثر چاہتے ہیں۔
صرف ان گروپوں کو رکھیں جو کسی شرط کو پورا کرتے ہوں: مزید کے ساتھ محکمے۔
2 سے زیادہ افراد، 100k سے زیادہ اوسط بجٹ والے پروجیکٹس، صارفین کے ساتھ
کم از کم 10 آرڈرز۔ ایسا کرنے کے لیے WHERE کافی نہیں ہے۔
کیوں جہاں کافی نہیں ہے۔
WHERE فلٹر کرتا ہے ٹیبل کی قطاروں کو، فوری جمع کرنے سے پہلے۔ تو یہ نہیں دیکھ سکتا
COUNT(*) یا AVG(...) کا نتیجہ: جب تک WHERE چلتا ہے، وہ
اقدار ابھی تک شمار نہیں کی گئی ہیں.
-- ERROR: COUNT(*) doesn't exist yet when WHERE is evaluated
SELECT department_id, COUNT(*) AS count
FROM employees
WHERE COUNT(*) > 2 -- ❌ doesn't work
GROUP BY department_id;جمع کرنے کے بعد** فلٹر کرنے کے لیے ایک وقف شدہ شق ہے: **HAVING**۔
نحو
SELECT grouping_column, AGGREGATE_FUNCTION(...)
FROM table
GROUP BY grouping_column
HAVING condition_on_aggregate;-- Departments with more than 2 employees:
SELECT department_id, COUNT(*) AS count
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 2;HAVING سے GROUP BY کیا ہے WHERE سے FROM: ایک ہی خیال
("فلٹر")، لیکن گروپنگ کے بعد، مجموعی طور پر لاگو کیا گیا۔
شقوں کی منطقی ترتیب
WHERE اور HAVING کو دوبارہ کبھی الجھانے کے لئے، اس ترتیب کو یاد رکھیں جس میں
ایس کیو ایل انہیں ذہنی طور پر انجام دیتا ہے:
FROM/JOIN— ذرائع کو شامل کر کے ابتدائی جدول بناتا ہے۔WHERE— ان قطاروں کو چھوڑ دیتا ہے جن کی آپ کو پرواہ نہیں ہے۔GROUP BY— بقیہ قطاروں کو گروپس میں جمع کرتا ہے۔HAVING— ان گروپوں کو چھوڑ دیتا ہے جن کی آپ کو پرواہ نہیں ہے۔SELECT— حتمی کالموں کی گنتی کرتا ہے (بشمول مجموعی)۔ORDER BY/LIMIT— دوبارہ ترتیب دیں اور کاٹیں۔
اہم نوٹس:
WHEREمیں آپ صرف ٹیبل کالم استعمال کر سکتے ہیں؛HAVINGمیں آپ گروپنگ کالمز اور ایگریگیٹس استعمال کر سکتے ہیں۔
-- Classic combo: filter first, group, filter the groups, sort.
SELECT d.name, AVG(e.salary) AS average
FROM employees AS e
JOIN departments AS d ON e.department_id = d.id
WHERE e.hired_on >= '2018-01-01' -- filter rows
GROUP BY d.name
HAVING AVG(e.salary) > 35000 -- filter groups
ORDER BY average DESC;اسے آزمائیں
ہر محکمے کے لیے، نام (departments.name) اور ملازمین کی تعداد دکھائیں، لیکن صرف ان محکموں کے لیے جہاں کم از کم 2 ملازمین ہوں۔ دو کالم، ایک قطار فی کوالیفائنگ ڈیپارٹمنٹ۔
اشارہ دکھائیں۔
HAVING میں 'کم از کم 2' شرط COUNT(*) >= 2 بن جاتی ہے۔
3 کوششوں کے بعد حل دستیاب ہے۔
ورزش کا جائزہ لیں۔
وہ محکمے (departments.name) دکھائیں جن کی اوسط تنخواہ 35000 سے زیادہ ہے۔ 2018 کے بعد سے صرف ملازمین کی خدمات حاصل کرنے پر غور کریں۔ دو کالم: نام اور اوسط۔ اوسط نزولی کے لحاظ سے ترتیب دیں۔
اشارہ دکھائیں۔
جہاں قطاروں کو فلٹر کرتا ہے (2018 سے ملازمت پر رکھے گئے ملازمین)، گروپوں کو فلٹر کرنا (اوسط> 35000)۔
3 کوششوں کے بعد حل دستیاب ہے۔