جملة GROUP BY في SQL

تُستخدم جملة GROUP BY في SQL لتجميع الصفوف التي تتشارك القيمة نفسها في عمود معيّن، ثم تطبيق دالة تجميعية مثل COUNT أو SUM أو AVG على كل مجموعة على حدة. وهي أداة أساسية لتحويل بيانات تفصيلية كثيرة إلى ملخصات مفيدة، كحساب عدد المستخدمين في كل دولة أو إجمالي المبيعات لكل تصنيف.

كيف تعمل GROUP BY؟

عند استخدام GROUP BY، تقسّم قاعدة البيانات الصفوف إلى مجموعات بحسب قيمة العمود المحدد، ثم تُرجع صفاً واحداً يمثّل كل مجموعة. ولهذا يجب أن تكون الأعمدة في جملة SELECT إمّا ضمن GROUP BY نفسها، أو داخل دالة تجميعية، وإلا كانت النتيجة غير منطقية.

التجميع البسيط

المثال التالي يحسب عدد المستخدمين في كل دولة عبر تجميع الصفوف حسب عمود الدولة:

SELECT country, COUNT(*) AS users_count
FROM users
GROUP BY country;

تُرجع هذه الاستعلام صفاً لكل دولة، إلى جانب عدد المستخدمين فيها. لاحظ استخدام الاسم البديل AS لتسمية عمود النتيجة بشكل واضح.

التجميع مع الدوال التجميعية

يمكن دمج GROUP BY مع SUM أو AVG لحساب إجماليات أو متوسطات لكل مجموعة، كحساب إجمالي أسعار المنتجات في كل تصنيف:

SELECT category, SUM(price) AS total_price
FROM products
GROUP BY category;

التصفية بعد التجميع باستخدام HAVING

لا يمكن استخدام WHERE لتصفية نتائج التجميع، لأن WHERE تعمل على الصفوف قبل تجميعها. لذلك نستخدم HAVING التي تعمل على المجموعات بعد تكوينها، فنُظهر مثلاً الدول التي يزيد عدد مستخدميها على مئة فقط:

SELECT country, COUNT(*) AS users_count
FROM users
GROUP BY country
HAVING COUNT(*) > 100;

الفرق الجوهري: WHERE تصفّي الصفوف قبل التجميع، وHAVING تصفّي المجموعات بعد التجميع.

أخطاء شائعة

  • وضع عمود في SELECT ليس ضمن GROUP BY ولا داخل دالة تجميعية، ما يعطي نتائج غير متوقعة أو خطأً.
  • استخدام WHERE بدلاً من HAVING لتصفية نتائج الدوال التجميعية.
  • نسيان أن GROUP BY يجب أن تأتي بعد WHERE وقبل ORDER BY في ترتيب الجملة.

تمرين محلول

المطلوب: من جدول orders، احسب متوسط قيمة الطلبات لكل عميل، واعرض فقط العملاء الذين يتجاوز متوسط طلباتهم 500.

SELECT customer_id, AVG(total) AS avg_order
FROM orders
GROUP BY customer_id
HAVING AVG(total) > 500;

جمّعنا الطلبات حسب العميل، وحسبنا المتوسط لكل مجموعة، ثم صفّينا المجموعات بـ HAVING لإظهار من تجاوز متوسطه 500 فقط.

الخلاصة

جملة GROUP BY تحوّل البيانات التفصيلية إلى ملخصات قابلة للتحليل عبر تجميع الصفوف وتطبيق الدوال التجميعية. وإتقان الفرق بين WHERE وHAVING، والانتباه لترتيب الجمل، مفتاحٌ لكتابة تقارير دقيقة وفعّالة من قاعدة البيانات.