ROLLUP للمجاميع الفرعية
المجاميع الفرعية التراكمية والإجماليات الكلية
ROLLUP للمجاميع الفرعية درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 2 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
ما المقصود بـ ROLLUP؟
عند تجميع البيانات باستخدام GROUP BY، تحصل على صف واحد لكل مجموعة. لكنك غالبًا ما تريد أيضًا إجماليات فرعية لكل مجموعة وإجماليًا كليًا لجميع الصفوف. وهذا تحديدًا ما تنفذه ROLLUP.
إن ROLLUP امتداد لـ GROUP BY يضيف تلقائيًا صفوف تلخيص إضافية إلى مجموعة النتائج، فيمنحك إجماليات فرعية متتابعة عند كل مستوى من التسلسل الهرمي للتجميع، ثم إجماليًا كليًا نهائيًا في النهاية.
إعداد بيانات نموذجية
لننشئ جدولًا بسيطًا باسم sales لنتدرّب عليه. فهو يخزّن المنطقة وفئة المنتج ومبلغ البيع لكل معاملة. نفّذ العبارات أدناه لإنشاء الجدول وملئه بالبيانات.
CREATE TABLE sales (
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales VALUES
('East', 'Electronics', 500),
('East', 'Electronics', 300),
('East', 'Clothing', 150),
('West', 'Electronics', 700),
('West', 'Clothing', 200),
('West', 'Clothing', 100);أولًا: GROUP BY العادي
قبل استخدام ROLLUP، لنرَ ما الذي تمنحنا إياه عبارة GROUP BY العادية. يُرجع الاستعلام أدناه إجماليًا واحدًا لكل زوج (region, category)، من دون إجماليات فرعية أو إجمالي كلي.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY region, category
ORDER BY region, category;مقدمة إلى GROUP BY ROLLUP
استبدل GROUP BY بـ GROUP BY ROLLUP(...)، وستضيف SQL صفوف الإجماليات الفرعية تلقائيًا. وتشكل الأعمدة الموجودة داخل ROLLUP() تسلسلًا هرميًا، وينتج إجمالي فرعي لكل مستوى من ذلك التسلسل، بالإضافة إلى إجمالي كلي نهائي.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;قراءة مخرجات ROLLUP
تتضمن نتيجة ROLLUP ثلاثة أنواع من الصفوف:
- صفوف التفاصيل — صف واحد لكل تركيبة من (region, category)، تمامًا كما في GROUP BY العادي.
- صفوف الإجماليات الفرعية — صف واحد لكل منطقة، مع
category = NULL، يعرض إجمالي المنطقة. - صف الإجمالي الكلي — صف واحد تكون فيه كل من region وcategory مساوية لـ
NULL، ويعرض الإجمالي العام.
تعمل قيم NULL كعناصر نائبة تحدد مستوى التلخيص.
استخدام COALESCE لتسمية قيم NULL
قد تبدو علامات NULL مربكة للمستخدمين النهائيين. غلّف كل عمود بالدالة COALESCE لاستبدالها بتسميات مفيدة مثل 'جميع الفئات' و'الإجمالي الكلي'.
SELECT
COALESCE(region, 'Grand Total') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;ROLLUP لعمود واحد
يعمل ROLLUP مع عمود واحد أيضًا. فعند كتابة ROLLUP(region)، تحصل على صف واحد لكل منطقة، بالإضافة إلى صف إجمالي كلي واحد في النهاية. وهذه أبسط صيغة، وهي مفيدة لأي تقرير يحتاج إلى إجمالي متتابع أسفل صفوف التفاصيل.
SELECT
COALESCE(region, 'Grand Total') AS region,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region)
ORDER BY region;ROLLUP بثلاثة مستويات
يمكنك تمرير ثلاثة أعمدة أو أكثر إلى ROLLUP لبناء تسلسلات هرمية أعمق. فعند استخدام ROLLUP(year, region, category)، ستحصل على إجماليات فرعية لكل سنة ومنطقة، وإجماليات فرعية لكل سنة، وإجمالي كلي؛ إذ يضيف كل عمود إضافي مستوى آخر من التلخيص.
-- Extend the demo with a year column
SELECT
COALESCE(CAST(yr AS TEXT), 'All Years') AS year,
COALESCE(region, 'All Regions') AS region,
COALESCE(category, 'All Categories') AS category,
SUM(amount) AS total
FROM (
SELECT 2024 AS yr, region, category, amount FROM sales
UNION ALL
SELECT 2025 AS yr, region, category, amount FROM sales
) t
GROUP BY ROLLUP(yr, region, category)
ORDER BY yr, region, category;اكتشاف صفوف التلخيص باستخدام GROUPING()
تُرجع الدالة GROUPING() القيمة 1 عندما تكون قيمة العمود في ذلك الصف قيمة NULL أنشأها ROLLUP، أي عنصرًا نائبًا للتلخيص، وتُرجع 0 عندما تكون القيمة قيمة بيانات فعلية. ويتيح لك ذلك التمييز بين قيم NULL الحقيقية في البيانات وقيم NULL الخاصة بملخص ROLLUP.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_summary,
GROUPING(category) AS is_cat_summary
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region, category;تصفية صفوف التلخيص
نظرًا إلى أن ROLLUP يضيف الصفوف بعد التجميع، لا يمكنك تصفيتها باستخدام WHERE. استخدم HAVING أو غلّف الاستعلام بأكمله في استعلام فرعي. ويحتفظ المثال أدناه بالإجماليات الفرعية للمناطق فقط، أي الصفوف التي تكون فيها category قيمة NULL أنشأها ROLLUP، بينما تكون region قيمة فعلية.
SELECT region, SUM(amount) AS regional_total
FROM sales
GROUP BY ROLLUP(region, category)
HAVING GROUPING(category) = 1
AND GROUPING(region) = 0
ORDER BY region;ROLLUP مقارنةً بـ GROUPING SETS
إن ROLLUP(a, b) اختصار لمجموعة محددة من GROUPING SETS. والاستعلامان أدناه متكافئان تمامًا؛ إذ يجنّبك ROLLUP كتابة كل مستوى من مستويات التجميع يدويًا.
-- Using ROLLUP (concise)
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),
()
);اختبار سريع
اختبر مدى فهمك لـ ROLLUP بهذا السؤال.
مراجعة الدرس
أحسنت! إليك ملخصًا لما تعلّمته عن ROLLUP:
- ينشئ GROUP BY ROLLUP(a, b) تلقائيًا إجماليات فرعية لكل مستوى من التسلسل الهرمي للأعمدة، وإجماليًا كليًا لجميع الصفوف.
- تُميَّز صفوف التلخيص بقيمة NULL في الأعمدة التي جرى تجميعها تراكميًا. استخدم COALESCE لمنحها تسميات سهلة القراءة.
- تُرجع الدالة GROUPING() القيمة 1 لقيم NULL التي أنشأها ROLLUP، والقيمة 0 لقيم البيانات الفعلية، بحيث يمكنك التمييز بينها.
- استخدم HAVING GROUPING(...) = 1 لتصفية صفوف التلخيص فقط.
- إن ROLLUP(a, b) اختصار لـ GROUPING SETS((a, b), (a), ()).
يُعد ROLLUP الأداة الأساسية عندما يحتاج تقريرك إلى إجماليات فرعية وإجمالي كلي من دون كتابة استعلامات UNION معقدة.
الأسئلة الشائعة
هل درس «ROLLUP للمجاميع الفرعية» مجاني؟
نعم — نص درس «ROLLUP للمجاميع الفرعية» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «ROLLUP للمجاميع الفرعية»؟
المجاميع الفرعية التراكمية والإجماليات الكلية تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 2 من أصل 4.
كم من الوقت يستغرق درس «ROLLUP للمجاميع الفرعية»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما بعد GROUP BY واحد
- ROLLUP للمجاميع الفرعية
- CUBE لجميع التركيبات
- شرح GROUPING SETS