0Pricing
SQL Academy · درس

CASE في ORDER BY والتجميعات

الفرز والعدّ الشرطيان

CASE في ORDER BY والتجميعات درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.

الترتيب حسب أولوية مخصصة

ترتّب عبارة ORDER BY في SQL الصفوف عادةً وفق القيمة الطبيعية لعمود ما. لكن يمكنكم تضمين تعبير CASE داخل ORDER BY لإنشاء ترتيب مخصص بالكامل، وهو ترتيب لا يستطيع أي عمود واحد إنتاجه بمفرده.

تكون هذه التقنية مفيدة عندما تحدد قواعد العمل الأولوية بدلًا من قيم البيانات الأولية.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

كيف يعمل CASE داخل ORDER BY

عندما تقيّم قاعدة البيانات ORDER BY CASE ... END، فإنها تحسب عددًا صحيحًا (أو أي قيمة قابلة للمقارنة) لكل صف. ثم تُرتب الصفوف وفق هذه القيمة المحسوبة بدلًا من عمود أولي، أو بالإضافة إليه.

لا يُخزَّن تعبير CASE؛ بل يوجد فقط طوال مدة تنفيذ الاستعلام.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

ترتيب قيم NULL صراحةً

تضع قواعد البيانات المختلفة قيم NULL افتراضيًا في بداية النتيجة المرتبة أو نهايتها بطرق مختلفة. يتيح لكم استخدام CASE في ORDER BY تحديد موضع قيم NULL بدقة، بغض النظر عن محرّك قاعدة البيانات.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

الترتيب التصاعدي والتنازلي الشرطي

يمكن أن يحاكي CASE في ORDER BY اتجاهًا شرطيًا للترتيب أيضًا. فمن خلال ربط قيم الفئات بأرقام سالبة، يمكنكم عكس ترتيب مجموعات محددة عمليًا، مع إبقاء الترتيب العادي للمجموعات الأخرى.

يفيد ذلك عندما تحتاج أنواع مختلفة من الصفوف إلى منطق ترتيب مختلف ضمن مجموعة نتائج واحدة.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

CASE داخل COUNT

يمكنكم تضمين تعبير CASE داخل دالة تجميعية مثل COUNT. وتتمثل الحيلة في إرجاع قيمة غير NULL للصفوف التي تريدون عدّها، وإرجاع NULL للصفوف التي تريدون تخطيها، لأن COUNT يتجاهل قيم NULL.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

CASE داخل SUM — الإجماليات الشرطية

يتيح وضع CASE داخل SUM جمع القيم فقط عندما يكون الشرط صحيحًا، ومعاملة الصفوف غير المطابقة كأن قيمتها صفر. ويُعد هذا نمطًا شائعًا جدًا للتقارير على نمط pivot التي تقسّم عمودًا واحدًا إلى عدة أعمدة للمقاييس.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

AVG الشرطي باستخدام CASE

يعمل النمط نفسه مع AVG. وبما أن AVG يتجاهل قيم NULL، فإن إرجاع NULL للصفوف التي تريدون استبعادها ينتج متوسط الصفوف المطابقة فقط، من دون الحاجة إلى استعلام فرعي.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

التجميع باستخدام CASE — تقسيم الصفوف إلى فئات

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

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

استخدام اسم مستعار بدلًا من تكرار CASE

يؤدي تكرار تعبير CASE طويل في كل من SELECT وGROUP BY إلى كتابة مطوّلة. تتيح بعض قواعد البيانات (مثل MySQL، وPostgreSQL مع استخدام حلول التفافية) الإشارة إلى الاسم المستعار في ORDER BY، لكن ليس في GROUP BY. ويتمثل الأسلوب المحمول الأكثر أمانًا في وضع الاستعلام داخل استعلام فرعي أو CTE، ثم استخدام GROUP BY مع الاسم المستعار من هناك.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

دمج ORDER BY CASE مع ASC وDESC

بعد تعبير CASE، يمكنكم الاستمرار في إضافة ASC أو DESC، وإضافة أعمدة ترتيب أخرى تفصل بينها فواصل. وتكون نتيجة CASE مفتاح الترتيب الأول فقط؛ أما الأعمدة اللاحقة فتفصل بين الصفوف المتساوية بالطريقة المعتادة.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

مثال واقعي — لوحة معلومات المبيعات

إليكم استعلامًا واقعيًا يجمع بين تجميع قائم على CASE وفرز قائم على CASE. وينتج ملخصًا للمبيعات لكل منطقة، مرتبًا بحيث تظهر المنطقة ذات أعلى إيرادات دائمًا أولًا، مع وضع 'أخرى' في الأسفل.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

اختبار المعرفة

اختبروا فهمكم لاستخدام CASE داخل ORDER BY ودوال التجميع.

مراجعة الدرس

في هذا الدرس تعلمتم كيفية الجمع بين CASE وORDER BY ودوال التجميع:

  • CASE داخل ORDER BY — إسناد درجات فرز مخصصة إلى الصفوف، والتحكم في موضع ظهور NULL، ودمج قواعد فرز متعددة في استعلام واحد.
  • CASE داخل COUNT — إرجاع قيمة غير NULL للصفوف المراد تضمينها، وNULL (ضمنيًا أو صراحةً) للصفوف المراد تخطيها.
  • CASE داخل SUM / AVG — استخدام 0 أو NULL كقيمة ELSE لإنشاء مجاميع ومتوسطات شرطية في تمريرة واحدة.
  • CASE داخل GROUP BY — تجميع القيم المستمرة أو الفئوية في مجموعات معنونة لأغراض التجميع.

تلغي هذه الأنماط الحاجة إلى العديد من الاستعلامات الفرعية، وتجعل كتابة التقارير الشبيهة بالجداول المحورية في SQL عادي أمرًا سهلًا.

الأسئلة الشائعة

هل درس «CASE في ORDER BY والتجميعات» مجاني؟

نعم — نص درس «CASE في ORDER BY والتجميعات» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.

ماذا ستتعلم في «CASE في ORDER BY والتجميعات»؟

الفرز والعدّ الشرطيان تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟

لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «CASE في ORDER BY والتجميعات»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟

نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. تعبير CASE
  2. CASE البسيط مقابل CASE البحث
  3. تجميع البيانات وتسميتها
  4. CASE في ORDER BY والتجميعات
← العودة إلى SQL Academy