ما بعد GROUP BY واحد
نفّذ التجميع على مستويات متعددة
ما بعد GROUP BY واحد درس مجاني في SQL Academy على CoddyKit. هذا هو الدرس 1 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Academy 4 دروس في المجموع.
محدودية GROUP BY واحد
تتيح لكم عبارة GROUP BY القياسية تجميع الصفوف على مستوى محدد واحد، مثل إجمالي المبيعات لكل منطقة. ولكن ماذا لو أردتم أيضًا إجماليات لكل فئة منتج وإجماليًا كليًا، وكل ذلك في الاستعلام نفسه؟
يعمل تكرار الاستعلام ثلاث مرات واستخدام UNION ALL، لكنه مطوّل وبطيء. يوفّر SQL ثلاث إضافات قوية — GROUPING SETS وROLLUP وCUBE — لحل هذه المشكلة بأناقة في مرور واحد.
SELECT region, SUM(amount) AS total_sales
FROM sales
GROUP BY region;إعداد جدول المثال
سنستخدم طوال هذا الدرس جدولًا بسيطًا باسم sales يسجّل كل عملية بيع مع المنطقة والفئة والمبلغ. لننشئ الجدول ونملأه بالبيانات حتى يكون لكل استعلام لاحق سياقه الواضح.
CREATE TABLE sales (
id SERIAL PRIMARY KEY,
region TEXT,
category TEXT,
amount NUMERIC
);
INSERT INTO sales (region, category, amount) VALUES
('North', 'Electronics', 1200),
('North', 'Clothing', 800),
('South', 'Electronics', 950),
('South', 'Clothing', 600),
('East', 'Electronics', 1100),
('East', 'Clothing', 750);ما المقصود بـ GROUPING SETS؟
تتيح لك GROUPING SETS تعريف مستويات تجميع مستقلة متعددة داخل عبارة GROUP BY واحدة. تنتج كل مجموعة في القائمة مجموعة صفوف خاصة بها، تمامًا كما لو كتبت استعلامات منفصلة ودمجتها باستخدام UNION ALL.
الصيغة هي: GROUP BY GROUPING SETS ( (col1, col2), (col1), () ). وتمثل المجموعة الفارغة () الإجمالي الكلي لجميع الصفوف.
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
);قراءة مخرجات GROUPING SETS
عند تشغيل استعلام يستخدم GROUPING SETS، تُرتَّب الصفوف الناتجة عن مستويات التجميع المختلفة معًا. وتظهر الأعمدة التي لا تنتمي إلى مجموعة معينة على شكل NULL في ذلك الصف.
على سبيل المثال، سيحتوي الصف المنتمي إلى المجموعة (region) على NULL في العمود category، ما يشير إلى أن هذا الإجمالي يشمل جميع الفئات في تلك المنطقة. أما صف الإجمالي الكلي، أي المجموعة الفارغة، فيحتوي على NULL في كل من region وcategory.
SELECT
COALESCE(region, 'ALL REGIONS') AS region,
COALESCE(category, 'ALL CATEGORIES') AS category,
SUM(amount) AS total
FROM sales
GROUP BY GROUPING SETS (
(region, category),
(region),
()
)
ORDER BY region NULLS LAST, category NULLS LAST;مقدمة إلى ROLLUP
إن ROLLUP اختصار لتسلسل هرمي شائع من مجموعات التجميع. عند إعطائه العمودين (A, B)، ينشئ ROLLUP(A, B) تلقائيًا المجموعات التالية: (A, B) و(A) و().
وهذا مناسب جدًا للبيانات الهرمية، مثل التسلسل من السنة إلى الشهر إلى اليوم، أو من المنطقة إلى الفئة. ويكون عدد المجموعات الناتجة دائمًا n + 1، حيث تمثل n عدد الأعمدة المدرجة.
-- ROLLUP(region, category) is equivalent to:
-- GROUPING SETS ( (region, category), (region), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;ROLLUP بثلاثة مستويات
تؤدي إضافة عمود ثالث إلى ROLLUP إلى توسيع التسلسل الهرمي بمستوى إضافي. إذ ينشئ ROLLUP(A, B, C) أربع مجموعات: (A, B, C) و(A, B) و(A) و().
في المثال أدناه، تمثل year المستوى الخارجي، بينما تمثل category المستوى الأكثر تفصيلًا. وينتج الاستعلام إجماليات فرعية عند كل خطوة من التسلسل الهرمي، بالإضافة إلى صف إجمالي كلي واحد.
SELECT
year,
region,
category,
SUM(amount) AS total
FROM (
VALUES
(2024, 'North', 'Electronics', 1200),
(2024, 'North', 'Clothing', 800),
(2024, 'South', 'Electronics', 950),
(2025, 'North', 'Electronics', 1400),
(2025, 'South', 'Clothing', 700)
) AS t(year, region, category, amount)
GROUP BY ROLLUP(year, region, category)
ORDER BY year NULLS LAST, region NULLS LAST, category NULLS LAST;مقدمة إلى CUBE
إن CUBE أوسع نطاقًا من ROLLUP. فعند إعطائه n من الأعمدة، ينشئ جميع التركيبات الممكنة وعددها 2^n من مجموعات التجميع، بما فيها الإجمالي الكلي.
بالنسبة إلى CUBE(region, category)، تكون المجموعات الناتجة: (region, category) و(region) و(category) و() — أي أربع مجموعات إجمالًا. ويفيد ذلك عندما تريد إجماليات مقطعية من جميع الاتجاهات، لا على امتداد تسلسل هرمي واحد فقط.
-- CUBE(region, category) produces:
-- GROUPING SETS ( (region,category), (region), (category), () )
SELECT region, category, SUM(amount) AS total
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;CUBE أم ROLLUP — متى نستخدم كلًا منهما
اختر الأداة بناءً على ما إذا كانت أبعادك تتبع تسلسلًا هرميًا طبيعيًا:
- استخدم ROLLUP عندما تكون الأعمدة هرمية، مثل التسلسل من الدولة إلى المدينة إلى المتجر. إذ تُجمَّع الإجماليات الفرعية على مسار واحد فقط.
- استخدم CUBE عندما تكون الأعمدة أبعادًا مستقلة، مثل المنطقة والفئة، وتريد جميع المقاطع العرضية الممكنة.
- استخدم GROUPING SETS عندما تحتاج إلى تحكم كامل ولا يطابق ROLLUP أو CUBE متطلباتك بدقة.
دالة GROUPING()
نظرًا إلى أن NULL قد تعني إما قيمة مفقودة فعلية أو عنصرًا نائبًا للتجميع، توفّر SQL الدالة GROUPING(). وتُرجع 1 عندما يكون العمود جزءًا من صف تجميع فائق، أي صف يحتوي على عنصر نائب، وتُرجع 0 عندما يكون العمود قد استُخدم فعليًا في التجميع.
يتيح لك ذلك التمييز بين قيمة NULL فعلية في region وصف إجمالي فرعي يشمل جميع المناطق.
SELECT
region,
category,
SUM(amount) AS total,
GROUPING(region) AS is_region_subtotal,
GROUPING(category) AS is_category_subtotal
FROM sales
GROUP BY CUBE(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;استخدام GROUPING() لتسمية الصفوف
من الأنماط الشائعة دمج GROUPING() مع تعبير CASE لإنتاج تسميات مفهومة للمستخدم بدلًا من قيم NULL الخام. وهذا يجعل مخرجات استعلام ROLLUP أو CUBE أسهل بكثير في القراءة داخل التقارير.
SELECT
CASE GROUPING(region)
WHEN 1 THEN 'Grand Total'
ELSE region
END AS region_label,
CASE GROUPING(category)
WHEN 1 THEN 'All Categories'
ELSE category
END AS category_label,
SUM(amount) AS total
FROM sales
GROUP BY ROLLUP(region, category)
ORDER BY GROUPING(region), region, GROUPING(category), category;مزج الأعمدة الثابتة مع ROLLUP
يمكنك مزج أعمدة GROUP BY العادية مع ROLLUP أو CUBE في العبارة نفسها. فالأعمدة المدرجة خارج ROLLUP(...) تكون مضمنة دائمًا في كل مجموعة تجميع، ولا تُجمَّع تراكميًا مطلقًا.
في الاستعلام أدناه، يُعد year عمود تجميع ثابتًا، بينما يشارك region وcategory في التجميع التراكمي. وهذا يعني أنك تحصل على إجماليات فرعية لكل سنة، لا على إجمالي يشمل جميع السنوات.
SELECT
2024 AS year,
region,
category,
SUM(amount) AS total
FROM sales
GROUP BY 2024, ROLLUP(region, category)
ORDER BY region NULLS LAST, category NULLS LAST;اختبار سريع
اختبر مدى فهمك لـ GROUPING SETS وROLLUP وCUBE.
مراجعة — ما بعد GROUP BY واحد
تعلّمت في هذا الدرس ثلاث إضافات قوية إلى SQL تتيح لك إنتاج مستويات تجميع متعددة في استعلام واحد:
- GROUPING SETS — تحكم يدوي كامل؛ إذ تسرد التركيبات التي تحتاج إليها تحديدًا.
- ROLLUP — مثالي للتسلسلات الهرمية؛ إذ ينتقل من المستوى الأكثر تفصيلًا إلى الإجمالي الكلي.
- CUBE — ينشئ كل مقطع عرضي ممكن للأبعاد المدرجة.
كما تعلّمت أن GROUPING() يميّز بين قيم NULL الفعلية وصفوف العناصر النائبة للتجميع الفائق، وأن أنماط CASE GROUPING(...) تنتج مخرجات تقارير واضحة وسهلة القراءة.
لا غنى عن هذه الأدوات عندما تحتاج إلى ملخصات متعددة الأبعاد؛ إذ تعتمد عليها تقارير الجداول المحورية ولوحات المعلومات واستعلامات مستودعات البيانات اعتمادًا كبيرًا.
الأسئلة الشائعة
هل درس «ما بعد GROUP BY واحد» مجاني؟
نعم — نص درس «ما بعد GROUP BY واحد» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Academy، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Academy 4 دروس في المجموع.
ماذا ستتعلم في «ما بعد GROUP BY واحد»؟
نفّذ التجميع على مستويات متعددة تتمرن على SQL Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Academy؟
لا تُشترط خبرة سابقة. SQL Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 1 من أصل 4.
كم من الوقت يستغرق درس «ما بعد GROUP BY واحد»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Academy هذا؟
نعم. كل درس في SQL Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- ما بعد GROUP BY واحد
- ROLLUP للمجاميع الفرعية
- CUBE لجميع التركيبات
- شرح GROUPING SETS