TOP

SQL-الدرس الثامن. تجميع البيانات (GROUP BY)

يتيح لك تجميع البيانات تقسيم جميع البيانات إلى مجموعات منطقية، مما يجعل من الممكن إجراء حسابات إحصائية بشكل منفصل في كل مجموعة.


1. إنشاء المجموعات (GROUP BY)

يتم إنشاء المجموعات باستخدام عبارة GROUP BY الخاصة بعامل التشغيل SELECT. دعونا نفكر في مثال.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product

ومن خلال هذا الطلب، استخرجنا معلومات عن عدد المنتجات المباعة في كل شهر. يطلب عامل التشغيل SELECT إخراج عمودين المنتج - اسم المنتج وProduct_num - الحقل المحسوب الذي أنشأناه لعرض كمية المنتجات المباعة (صيغة الحقل SUM(Quantity)). تخبر جملة GROUP BY نظام إدارة قواعد البيانات بتجميع البيانات حسب عمود المنتج.

ومن الجدير بالذكر أيضًا أن GROUP BY يجب أن يأتي بعد جملة WHERE وقبل ORDER BY.

2. تصفية المجموعات (HAVING)

مثلما نقوم بتصفية الصفوف في الجدول، يمكننا التصفية على البيانات المجمعة. لهذا، يوجد عامل التشغيل HAVING في SQL. لنأخذ المثال السابق ونضيف تصفية المجموعة.

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

نرى أنه بعد حساب عدد البضائع المباعة لكل منتج، يقوم نظام إدارة قواعد البيانات "بقطع" تلك المنتجات التي تم بيعها أقل من 4000 وحدة.

كما ترون، فإن عامل التشغيل HAVING يشبه إلى حد كبير عامل التشغيل WHERE، ولكن هناك فرق كبير بينهما: WHERE يقوم بتصفية البيانات قبل تجميعها، وHAVING يقوم بتصفية البيانات بعد التجميع. وبالتالي، لن يتم تضمين الصفوف التي تمت إزالتها بواسطة جملة WHERE في المجموعة. لذلك، يمكن استخدام عوامل التشغيل WHERE وHAVING في نفس الجملة. خذ بعين الاعتبار مثالا:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
WHERE Product <> 'Skis Long' 
GROUP BY Product 
HAVING SUM(Quantity) > 4000

أضفنا عامل التشغيل WHERE إلى المثال السابق، حيث حددنا المنتج "Skis Long"، والذي أثر بدوره على التجميع بواسطة عامل التشغيل HAVING. ونتيجة لذلك، يمكننا أن نرى أن منتج "Skis Long" لم يدخل في قائمة المجموعات التي تضم أكثر من 4000 منتج مباع.

3. التجميع والفرز

كما هو الحال مع أخذ عينات البيانات العادية، يمكننا فرز المجموعات بعد التجميع باستخدام عامل التشغيل HAVING. لهذا، يمكننا استخدام عامل التشغيل المألوف بالفعل ORDER BY. في هذه الحالة، تطبيقه مشابه للأمثلة السابقة. مثال:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY SUM(Quantity)

أو ببساطة حدد رقم الحقل بالترتيب الذي نريد الفرز به:

Run SQLSELECT Product, SUM(Quantity) AS Product_num 
FROM Sumproduct 
GROUP BY Product 
HAVING SUM(Quantity) > 3000
ORDER BY 2

نرى أنه من أجل فرز نتائج التلخيص، نحتاج فقط إلى كتابة الجملة باستخدام ORDER BY بعد عامل التشغيل HAVING.

MS Access لا يدعم فرز المجموعات حسب الأسماء المستعارة للأعمدة، أي في مثالنا، لفرز القيم، لن نتمكن من كتابة ORDER BY Product_num في نهاية الاستعلام.