0Pricing
SQL Academy · درس

CUBE لجميع التركيبات

أنشئ كل تركيبات التجميع دفعةً واحدة

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

ما المقصود بـ CUBE؟

ينشئ امتداد CUBE في SQL كل تركيبة تجميع ممكنة من قائمة أعمدة. فبينما ينشئ ROLLUP تسلسلًا هرميًا، ينتج CUBE حاصل الضرب الكامل للإجماليات الفرعية، بما في ذلك الإجمالي الكلي.

فكّر فيه باعتباره يجيب عن السؤال التالي: "أرني كل إجمالي فرعي يمكن حسابه من هذه الأعمدة"

إعداد الجدول

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

CREATE TABLE sales (
  year     INT,
  region   VARCHAR(20),
  category VARCHAR(20),
  revenue  NUMERIC(10,2)
);

INSERT INTO sales VALUES
  (2023, 'North', 'Electronics', 12000),
  (2023, 'North', 'Clothing',     8000),
  (2023, 'South', 'Electronics',  9500),
  (2023, 'South', 'Clothing',     6000),
  (2024, 'North', 'Electronics', 14000),
  (2024, 'North', 'Clothing',     9500),
  (2024, 'South', 'Electronics', 11000),
  (2024, 'South', 'Clothing',     7200);

أول استعلام CUBE لك

الصيغة مباشرة: استبدل GROUP BY بـ GROUP BY CUBE(...)، ثم أدرج الأعمدة بداخله. وستنشئ SQL جميع تركيبات هذه الأعمدة على شكل مجموعات تجميع.

SELECT
  year,
  region,
  category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;

كم عدد التجميعات التي ينتجها CUBE؟

بالنسبة إلى n من الأعمدة، ينتج CUBE عدد 2n من مجموعات التجميع، واحدة لكل مجموعة جزئية من قائمة الأعمدة، بما في ذلك المجموعة الفارغة، أي الإجمالي الكلي.

وبوجود 3 أعمدة (year وregion وcategory)، يكون الناتج 2³ = 8 مجموعات تجميع: كل عمود بمفرده، وكل زوج من الأعمدة، والأعمدة الثلاثة معًا، ومن دون أي عمود.

-- 3 columns => 8 grouping sets:
-- (year, region, category)
-- (year, region)
-- (year, category)
-- (region, category)
-- (year)
-- (region)
-- (category)
-- () <- grand total
SELECT COUNT(*) AS row_count
FROM (
  SELECT year, region, category, SUM(revenue)
  FROM sales
  GROUP BY CUBE(year, region, category)
) sub;

تشير قيم NULL إلى البُعد المُجمَّع

تمامًا مثل ROLLUP، يستخدم CUBE القيمة NULL للإشارة إلى أن عمودًا ما جرى التجميع عليه. فإذا كانت قيمة region هي NULL في صف من النتائج، فإن ذلك الصف يلخّص جميع المناطق لهذه التركيبة من الأعمدة المتبقية.

استخدم GROUPING(col) للتمييز بين قيمة NULL فعلية وعلامة تجميع.

SELECT
  GROUPING(year)     AS g_year,
  GROUPING(region)   AS g_region,
  GROUPING(category) AS g_category,
  year,
  region,
  category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY g_year, g_region, g_category;

جعل قيم NULL سهلة القراءة باستخدام COALESCE

لجعل المخرجات أسهل قراءة في التقارير، غلّف كل عمود مُجمَّع بالدالة COALESCE، واستبدل قيمة NULL الخاصة بالتجميع بتسمية وصفية مثل 'ALL'.

SELECT
  COALESCE(CAST(year AS VARCHAR), 'ALL YEARS')     AS year,
  COALESCE(region,   'ALL REGIONS')                AS region,
  COALESCE(category, 'ALL CATEGORIES')             AS category,
  SUM(revenue)                                     AS total_revenue
FROM sales
GROUP BY CUBE(year, region, category)
ORDER BY year, region, category;

CUBE مقارنةً بـ ROLLUP — الفرق الأساسي

لا ينشئ ROLLUP(a, b, c) إلا الإجماليات الفرعية على امتداد تسلسل هرمي واحد: (a,b,c) و(a,b) و(a) و(). وهو يحترم الترتيب من اليسار إلى اليمين.

أما CUBE(a, b, c) فينشئ كل مجموعة جزئية، بما في ذلك المقاطع العرضية مثل (a,c) أو (b) بمفرده، وهي مجموعات يتجاهلها ROLLUP تمامًا. استخدم CUBE عندما تحتاج إلى تحليل كامل متعدد الأبعاد من دون تسلسل هرمي محدد مسبقًا.

-- ROLLUP: 4 grouping sets
SELECT year, region, SUM(revenue)
FROM sales
GROUP BY ROLLUP(year, region);

-- CUBE: 4 grouping sets for 2 columns (same count here)
-- but adds the (region) subtotal that ROLLUP omits
SELECT year, region, SUM(revenue)
FROM sales
GROUP BY CUBE(year, region);

CUBE جزئي

يمكنك مزج أعمدة GROUP BY العادية مع قائمة فرعية من CUBE. فالأعمدة المدرجة خارج CUBE(...) تكون موجودة دائمًا في كل مجموعة تجميع، بينما تحصل الأعمدة الموجودة بداخله وحدها على معالجة جميع التركيبات.

-- year is fixed; CUBE only over region and category
SELECT
  year,
  COALESCE(region,   'ALL REGIONS')    AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY year, CUBE(region, category)
ORDER BY year, region, category;

التصفية باستخدام HAVING على نتائج CUBE

تعمل HAVING مع ناتج CUBE تمامًا كما تعمل مع GROUP BY العادية. يمكنكم تصفية صفوف التجميع التي لا تستوفي قيمها التجميعية حدًا معينًا، مثل الاحتفاظ بالصفوف التي يتجاوز فيها إجمالي الإيرادات حدًا أدنى.

SELECT
  COALESCE(region,   'ALL REGIONS')    AS region,
  COALESCE(category, 'ALL CATEGORIES') AS category,
  SUM(revenue) AS total_revenue
FROM sales
GROUP BY CUBE(region, category)
HAVING SUM(revenue) > 15000
ORDER BY total_revenue DESC;

دمج CUBE مع دوال النوافذ

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

WITH cube_result AS (
  SELECT
    COALESCE(region,   'ALL') AS region,
    COALESCE(category, 'ALL') AS category,
    SUM(revenue) AS total_revenue
  FROM sales
  GROUP BY CUBE(region, category)
)
SELECT
  region,
  category,
  total_revenue,
  RANK() OVER (ORDER BY total_revenue DESC) AS revenue_rank
FROM cube_result
ORDER BY revenue_rank;

متى تختارون CUBE

يكون CUBE الأداة المناسبة عندما:

  • تحتاجون إلى كل تركيبات الإجماليات الفرعية في تقرير مخصص أو تقرير بأسلوب OLAP.
  • لا يوجد تسلسل هرمي طبيعي بين أعمدة التجميع.
  • تريدون تمكين المحللين من تقسيم البيانات بالطريقة التي يختارونها.

تجنبوا استخدام CUBE عندما يكون عدد الأعمدة كبيرًا؛ فوجود 4 أعمدة ينتج 16 مجموعة تجميع، ووجود 5 أعمدة ينتج 32 مجموعة. فضّلوا استخدام ROLLUP أو GROUPING SETS الصريحة للحفاظ على إمكانية إدارة مجموعات النتائج.

تحقق سريع

كم عدد مجموعات التجميع المميزة التي ينتجها GROUP BY CUBE(a, b, c, d)؟

مراجعة الدرس

تعلمتم في هذا الدرس كيف ينشئ CUBE كل تركيبة ممكنة من مجموعات التجميع انطلاقًا من قائمة أعمدة، مما يجعله مناسبًا للتقارير متعددة الأبعاد.

أهم النقاط:

  • ينتج GROUP BY CUBE(a, b, c) عددًا من مجموعات التجميع يساوي 2n.
  • تشير قيمة NULL في عمود النتيجة إلى أنه تم التجميع على ذلك البعد؛ استخدموا GROUPING() لاكتشاف ذلك.
  • تحوّل COALESCE قيم NULL الناتجة عن التجميع إلى تسميات مفهومة.
  • يؤدي استخدام CUBE جزئي، مثل GROUP BY year, CUBE(region, category)، إلى تثبيت بعض الأعمدة وتطبيق CUBE على الأعمدة المتبقية فقط.
  • استخدموا CUBE للتحليل المخصص الكامل، وفضّلوا ROLLUP أو GROUPING SETS الصريحة عندما يكون التسلسل الهرمي معروفًا أو يكون عدد الأعمدة كبيرًا.

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

هل درس «CUBE لجميع التركيبات» مجاني؟

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

ماذا ستتعلم في «CUBE لجميع التركيبات»؟

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

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

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

كم من الوقت يستغرق درس «CUBE لجميع التركيبات»؟

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

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

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

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

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