GROUP BY কী?
আগের পাঠে পুরো টেবিলের জন্য একটি হিসাব করেছি। কিন্তু প্রতিটি গ্রুপে কতজন, প্রতিটি শিক্ষার্থীর মোট নম্বর কত, এমন প্রশ্নে প্রতিটি দলের জন্য আলাদা হিসাব লাগে। GROUP BY একই মানের সারিগুলোকে একটি দলে রাখে। তারপর প্রতিটি দলের জন্য Aggregate ফাংশন আলাদা করে হিসাব করে।
সিনট্যাক্স
SELECT [কলামের নাম], [ফাংশন]([কলামের নাম]) FROM [টেবিলের নাম] GROUP BY [কলামের নাম];
উদাহরণ ১: প্রতিটি গ্রুপে কতজন
SELECT group_name, COUNT(*) AS total
FROM student
GROUP BY group_name;ব্যাখ্যা
GROUP BY group_name→একই group_name এর সারিগুলো এক দলে যায়COUNT(*)→প্রতিটি দলে কয়টি সারি গণনা করেgroup_name→দলের নাম ফলাফলে দেখায়
নিচের টেবিলে একই রঙের সারি একই দলে। Science এর দুজন নীল, Commerce এর দুজন হলুদ, Arts এর একজন সবুজ।
| roll | name | class | section | group_name |
|---|---|---|---|---|
| 1 | Rudra | 11 | A | Science |
| 2 | Habib | 12 | A | Commerce |
| 3 | Pappu | 11 | B | Arts |
| 4 | Anik | 12 | B | Science |
| 5 | Priya | 11 | A | Commerce |
| group_name | total |
|---|---|
| Arts | 1 |
| Commerce | 2 |
| Science | 2 |
উদাহরণ ২: প্রতিটি শিক্ষার্থীর মোট নম্বর
result টেবিলে প্রতিটি roll এর তিনটি করে সারি আছে। roll অনুযায়ী দল করে নম্বর যোগ করি।
SELECT roll, SUM(marks) AS total_marks
FROM result
GROUP BY roll;| roll | subject_code | marks |
|---|---|---|
| 1 | 275 | 88 |
| 1 | 174 | 82 |
| 1 | 101 | 76 |
| 2 | 275 | 78 |
| 2 | 253 | 75 |
| 2 | 109 | 72 |
| 3 | 275 | 29 |
| 3 | 304 | 65 |
| 3 | 101 | 60 |
| 4 | 275 | 31 |
| 4 | 174 | 90 |
| 4 | 101 | 70 |
| 5 | 275 | 65 |
| 5 | 253 | 84 |
| 5 | 109 | 80 |
| roll | total_marks |
|---|---|
| 1 | 246 |
| 2 | 225 |
| 3 | 154 |
| 4 | 191 |
| 5 | 229 |
উদাহরণ ৩: প্রতিটি বিষয়ের গড়
SELECT subject_code, ROUND(AVG(marks), 2) AS avg_marks
FROM result
GROUP BY subject_code;| subject_code | avg_marks |
|---|---|
| 101 | 68.67 |
| 109 | 76.0 |
| 174 | 86.0 |
| 253 | 79.5 |
| 275 | 58.2 |
| 304 | 65.0 |
আরও একটি উদাহরণ: দুই কলামে দল
প্রতিটি class ও section এ কতজন আছে? দুই কলাম দিলে দুটোর মান একই হলে তবেই এক দলে যায়।
SELECT class, section, COUNT(*) AS total
FROM student
GROUP BY class, section;| class | section | total |
|---|---|---|
| 11 | A | 2 |
| 11 | B | 1 |
| 12 | A | 1 |
| 12 | B | 1 |
class 11, section A তে Rudra ও Priya আছে। তাই সেখানে total 2।
- SELECT এ যে সাধারণ কলাম লিখবে (ফাংশনের বাইরে), সেটি GROUP BY তেও লিখতে হবে।
- GROUP BY বসে WHERE এর পরে আর ORDER BY এর আগে।
- ফলাফলের দলগুলো কোন ক্রমে আসবে তা DBMS ভেদে আলাদা হতে পারে। নির্দিষ্ট ক্রম চাইলে ORDER BY দাও।
অনুশীলন
প্রতিটি প্রশ্নের Query নিজে লেখো। চাইলে SQL Playground এ টেবিল তৈরি করে চালিয়ে দেখো। তারপর উত্তর মিলিয়ে নাও।
প্রতিটি class এ কতজন শিক্ষার্থী আছে?
উত্তর দেখো
SELECT class, COUNT(*) AS total
FROM student
GROUP BY class;| class | total |
|---|---|
| 11 | 3 |
| 12 | 2 |
প্রতিটি বিষয়ে (subject_code) সর্বোচ্চ নম্বর কত?
উত্তর দেখো
SELECT subject_code, MAX(marks) AS highest
FROM result
GROUP BY subject_code;| subject_code | highest |
|---|---|
| 101 | 76 |
| 109 | 80 |
| 174 | 90 |
| 253 | 84 |
| 275 | 88 |
| 304 | 65 |
প্রতিটি roll কয়টি বিষয়ে পরীক্ষা দিয়েছে?
উত্তর দেখো
SELECT roll, COUNT(*) AS total_subject
FROM result
GROUP BY roll;| roll | total_subject |
|---|---|
| 1 | 3 |
| 2 | 3 |
| 3 | 3 |
| 4 | 3 |
| 5 | 3 |
subject টেবিলে প্রতিটি group_name এ কয়টি বিষয় আছে?
উত্তর দেখো
SELECT group_name, COUNT(*) AS total
FROM subject
GROUP BY group_name;| group_name | total |
|---|---|
| Arts | 1 |
| Commerce | 2 |
| Common | 2 |
| Science | 1 |
