মূল কন্টেন্টে যান
মডিউল 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) এর জন্য।

পঠনযোগ্য নামের জন্য যোগ দিন

প্রায়ই আপনি 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) সমষ্টি হিসাবে, d.name দ্বারা GROUP, গড় DESC দ্বারা ORDER।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ