0Pricing
SQL Academy · درس

شرح GROUPING SETS

اختر التجميعات التي تريدها بالضبط

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

ما هي GROUPING SETS؟

عند كتابة عبارة GROUP BY، فإنكم تحددون مجموعة واحدة من الأعمدة للتجميع بحسبها. لكنكم قد تحتاجون أحيانًا إلى تجميعات متعددة مختلفة في استعلام واحد، من دون تشغيل الاستعلام عدة مرات واستخدام UNION ALL.

تتيح لكم GROUPING SETS تحديد التجميعات التي تريدونها بدقة، وكل ذلك في مرور واحد على البيانات. تنتج كل مجموعة في القائمة صفوفها المجمعة الخاصة بها ضمن النتيجة.

الجدول النموذجي: sales

سنستخدم جدول sales طوال هذا الدرس. ويسجل الجدول المعاملات بحسب المنطقة وفئة المنتج والمبلغ.

شغّلوا الشيفرة لإنشاء الجدول وتعبئته حتى تتمكنوا من متابعة كل مثال.

CREATE TABLE sales (
  region   TEXT,
  category TEXT,
  amount   NUMERIC
);

INSERT INTO sales VALUES
  ('East',  'Electronics', 500),
  ('East',  'Clothing',    200),
  ('West',  'Electronics', 300),
  ('West',  'Clothing',    400),
  ('North', 'Electronics', 150),
  ('North', 'Clothing',    250);

الطريقة القديمة: UNION ALL

قبل ظهور GROUPING SETS، كان الحصول على الإجماليات على مستويات متعددة يتطلب كتابة استعلامات منفصلة ودمجها باستخدام UNION ALL. كانت هذه الطريقة تكرارية، وأصعب في القراءة، وتفحص الجدول عدة مرات.

يعرض المثال التالي الإجماليات بحسب المنطقة والإجماليات بحسب الفئة، باستخدام ثلاث عبارات SELECT منفصلة.

SELECT region, NULL AS category, SUM(amount) AS total
FROM sales
GROUP BY region

UNION ALL

SELECT NULL, category, SUM(amount)
FROM sales
GROUP BY category

UNION ALL

SELECT NULL, NULL, SUM(amount)
FROM sales;

صيغة GROUPING SETS

توضع عبارة GROUPING SETS داخل عبارة GROUP BY العادية أو بدلًا منها. وتدرجون كل تجميع مطلوب على شكل قائمة أعمدة بين قوسين. وتشير المجموعة الفارغة () إلى الإجمالي الكلي، أي من دون أي تجميع.

ينفذ هذا الاستعلام الواحد ما نفذته عبارة UNION ALL المؤلفة من ثلاثة أجزاء أعلاه تمامًا، لكن بصيغة أكثر اختصارًا وفي عملية فحص واحدة للجدول.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

قراءة النتيجة

ينتمي كل صف في الناتج إلى مجموعة تجميع واحدة بالضبط. عندما لا يكون العمود جزءًا من مجموعة التجميع النشطة، تكون قيمته NULL.

  • ينتمي الصف الذي تكون فيه region = 'East' وcategory = NULL إلى المجموعة (region).
  • ينتمي الصف الذي تكون فيه region = NULL وcategory = 'Electronics' إلى المجموعة (category).
  • الصف الذي تكون فيه القيمتان NULL هو الإجمالي الكلي الناتج من المجموعة ().

تُعد قيم NULL هذه بنيوية؛ فهي تعني «جميع القيم» لذلك البعد، وليست بيانات مفقودة.

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

يمكن أن تحتوي كل مجموعة تجميع على أكثر من عمود واحد. فالمجموعة (region, category) تجمع بحسب العمودين معًا، تمامًا مثل GROUP BY region, category العادية.

يؤدي دمج ذلك مع المجموعات الفردية والإجمالي الكلي إلى ملخص من أربعة مستويات في استعلام واحد.

SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  (category),
  ()
);

الدالة GROUPING()

بما أن NULL قد تعني أن هذا العمود لم يُستخدم في التجميع أو قد تعني بيانات مفقودة فعلية، توفر SQL الدالة GROUPING() للتمييز بين الحالتين.

تعيد GROUPING(col) القيمة 1 عندما يكون العمود مستبعدًا من مجموعة التجميع الحالية، أي عندما تكون قيمة NULL فيه بنيوية، وتعيد 0 عندما يكون العمود جزءًا من التجميع أو تكون له قيمة NULL فعلية.

SELECT
  region,
  category,
  SUM(amount)      AS total,
  GROUPING(region) AS is_region_total,
  GROUPING(category) AS is_category_total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

استبدال تسميات NULL

من الأنماط الشائعة استبدال قيم NULL البنيوية بتسمية وصفية لتسهيل قراءة التقارير. استخدموا CASE WHEN GROUPING(...) = 1 THEN 'All ...' ELSE col END لاستبدال التسمية في صفوف التجميع التراكمي فقط.

SELECT
  CASE WHEN GROUPING(region)   = 1 THEN 'All Regions'    ELSE region   END AS region,
  CASE WHEN GROUPING(category) = 1 THEN 'All Categories' ELSE category END AS category,
  SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region),
  (category),
  ()
);

مقارنة GROUPING SETS وROLLUP

تمثل ROLLUP(a, b) صيغة مختصرة تتوسع إلى مجموعات التجميع (a, b), (a), ()؛ فهي تضيف دائمًا الإجماليات الفرعية ضمن تسلسل هرمي، بالإضافة إلى الإجمالي الكلي.

تمنحكم GROUPING SETS تحكمًا كاملًا، إذ تختارون بالضبط التركيبات التي ستظهر. وإذا لم تكونوا بحاجة إلى التسلسل الهرمي الكامل، فيمكنكم حذف بعض المستويات. ينتج الاستعلامان أدناه الناتج نفسه.

-- Using ROLLUP
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category);

-- Equivalent explicit GROUPING SETS
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

مقارنة GROUPING SETS وCUBE

ينشئ CUBE(a, b) كل تركيبة ممكنة من الأعمدة المدرجة: (a, b), (a), (b), (). وهو مفيد للتحليل بين الأبعاد، لكنه ينتج عددًا كبيرًا من الصفوف.

تتيح لكم GROUPING SETS اختيار التركيبات التي تهمكم فقط، مما يحافظ على تركيز النتيجة ويساعد على سرعة الاستعلام.

-- CUBE produces 4 grouping sets for 2 columns
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category);

-- GROUPING SETS: omit the (category)-only set if not needed
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
);

حالة استخدام عملية: لوحة مبيعات

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

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

SELECT
  COALESCE(region,   'TOTAL')      AS region,
  COALESCE(category, 'ALL')        AS category,
  SUM(amount)                      AS total
FROM sales
GROUP BY GROUPING SETS (
  (region, category),
  (region),
  ()
)
ORDER BY
  GROUPING(region),
  region NULLS LAST,
  GROUPING(category),
  category NULLS LAST;

تحقق سريع

اختبروا مدى فهمكم لـ GROUPING SETS.

مراجعة الدرس

إليكم ما تعلمتموه عن GROUPING SETS:

  • تتيح لكم GROUPING SETS تحديد تركيبات تجميع متعددة في استعلام واحد، لتحل محل أنماط UNION ALL التكرارية.
  • تُدرج كل مجموعة على شكل قائمة أعمدة بين قوسين داخل GROUP BY GROUPING SETS (...). وتنتج المجموعة الفارغة () الإجمالي الكلي.
  • تظهر الأعمدة غير الموجودة في المجموعة النشطة على شكل NULL في ذلك الصف؛ استخدموا GROUPING(col) لاكتشاف قيم NULL البنيوية هذه.
  • يُعد ROLLUP وCUBE اختصارين مناسبين للأنماط الشائعة، لكن GROUPING SETS تمنحكم تحكمًا كاملًا ودقيقًا في التجميعات التي يتم تضمينها.
  • ادمجوا ذلك مع COALESCE أو CASE WHEN GROUPING(...) لاستبدال قيم NULL بتسميات سهلة القراءة في التقارير.

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

هل درس «شرح GROUPING SETS» مجاني؟

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

ماذا ستتعلم في «شرح GROUPING SETS»؟

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

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

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

كم من الوقت يستغرق درس «شرح GROUPING SETS»؟

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

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

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

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

  1. ما بعد GROUP BY واحد
  2. ROLLUP للمجاميع الفرعية
  3. CUBE لجميع التركيبات
  4. شرح GROUPING SETS
← العودة إلى SQL Academy