عبارة GROUP BY
تُستخدم عبارة GROUP BY في استعلام SELECT
بهدف تجميع النتائج ضمن مجموعات بحسب عمود أو أكثر من الجدول.
استخدام GROUP BY
لمعرفة عدد السجلات الممكن تجميعها سويةً
ليكن الجدول الآتي (patients) موجودًا في قاعدة البيانات:
Doctor | Section | Age | Patient | PatientID |
---|---|---|---|---|
Nasser | Cardiology | 76 | Salem | 1029 |
Abd Allah | Neurology | 17 | Hasan | 896 |
Reem | Maternity | 23 | Nadine | 964 |
Fateh | Cardiology | 65 | Rami | 1070 |
Kareem | Neurology | 19 | Abd al-Rahim | 1150 |
Hadi | Critical Care | 65 | Roushd | 1097 |
Reem | Maternity | 27 | Sana | 1034 |
Abd Allah | Neurology | 49 | Helen | 963 |
Hadi | Critical Care | 58 | Ahmad | 1154 |
Kareem | Neurology | 40 | Maher | 1069 |
Amnah | Maternity | 30 | Zeina | 1028 |
Fateh | Cardiology | 55 | Sarah | 1180 |
Hadi | Critical Care | 23 | Fadi | 1076 |
Abd Allah | Neurology | 36 | Naim | 987 |
Fateh | Cardiology | 70 | Batoul | 1156 |
Amnah | Maternity | 24 | Rahaf | 1181 |
Nasser | Cardiology | 66 | Aya | 808 |
الاستعلام الآتي يحدد عدد المرضى في كل قسم اعتمادًا على الدالة التجميعيّة count()
:
SELECT Section, count(*) AS Number of patients
FROM patients
GROUP BY Section;
وتظهر النتائج كما الآتي:
Number of patients | Section |
---|---|
5 | Cardiology |
5 | Neurology |
4 | Maternity |
3 | Critical Care |
ولدى استخدام حقلين ضمن عبارة GROUP BY
كما في الاستعلام الآتي:
SELECT Section, Doctor, count(Patient) AS Number of patients
FROM patients
GROUP BY Section, Doctor
تُجمَّع النتائج بحسب العمود المُحدد أولًا ثم العمود الثاني وهكذا، وستظهر النتائج الآتية:
Number of patients | Doctor | Section |
---|---|---|
2 | Nasser | Cardiology |
3 | Fateh | Cardiology |
3 | Abd Allah | Neurology |
2 | Kareem | Neurology |
2 | Reem | Maternity |
2 | Amnah | Maternity |
3 | Hadi | Critical Care |
تجميع النتائج المحققة لشرط محدد
الاستعلام الآتي يحدد عدد المرضى لدى كل طبيب ويستثني الأطباء المعالجِين لأقل من 3 مرضى اعتمادًا على العبارة HAVING
التي تقوم بتحديد الشرط المطلوب عند استخدام التجميع:
SELECT Doctor, count(Patient) AS Number of patients
FROM patients
GROUP BY Doctor
HAVING count(Patient)>2 ;
وتظهر النتائج كما يلي:
Number of patients | Doctor |
---|---|
3 | Fateh |
3 | Abd Allah |
3 | Hadi |
تجميع النتائج من عدة جداول
ليكن الجدول الآتي (doctors) في قاعدة البيانات (إضافة للجدول السابق بأسماء المرضى):
City | DoctorName |
---|---|
Damascus | Nasser |
Aleppo | Fateh |
Aleppo | Abd Allah |
Hama | Kareem |
Damascus | Reem |
Aleppo | Amnah |
Damascus | Hadi |
إن تنفيذ الاستعلام الآتي:
SELECT doctors.City, count(patients.Patient) AS Number of patients in city
FROM patients
LEFT JOIN doctors ON patients.Doctor = doctors.DoctorName
GROUP BY City;
يربط ما بين الجدولين ربطًا يساريًا ويرتب النتائج بمجموعات حسب عمود المدينة الموجود في جدول الأطباء، وهذا يؤدي لظهور عدد المرضى في كل مدينة على النحو الآتي:
City | Number of patients in city |
---|---|
Damascus | 7 |
Aleppo | 8 |
Hama | 2 |
ملاحظة: لا يمكن استخدام الأعمدة التي نوعها text
أو ntext
أو image
ضمن عبارة GROUP BY
.
التوافقية
SQLServer | SQLite | Oracle | PostgreSQL | MySQL |
---|---|---|---|---|
نعم | نعم | نعم | نعم | نعم |