عبارة GROUP BY

من موسوعة حسوب
< SQL

تُستخدم عبارة 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
نعم نعم نعم نعم نعم

مصادر