التوزيع التراكمي والنسبة من الإجمالي
حساب النسب التراكمية وحصة الإجمالي داخل الأقسام
التوزيع التراكمي والنسبة من الإجمالي درس مجاني في SQL Interview Prep على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في SQL Interview Prep، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
سؤال النسبة من الإجمالي
من الأسئلة الأساسية في مقابلات إعداد التقارير: "ما النسبة التي تمثلها إيرادات كل فئة من إجمالي الإيرادات؟" وكذلك السؤال المرتبط به تراكميًا: "ما الحصة التراكمية من الإجمالي؟"
تكمن الحيلة في قسمة قيمة كل صف على إجمالي نافذة محسوب على مستوى التقسيم بأكمله. والفكرة التي يُختبر فهمها هي معرفة إمكانية وضع إجمالي كلي داخل دالة نافذة، من دون الحاجة إلى ربط ذاتي.
SUM ضمن نافذة من دون ORDER BY = الإجمالي الكلي
إليك الخطوة الأساسية: إن SUM(amount) OVER ()، باستخدام OVER فارغة ومن دون ORDER BY، تُرجع إجمالي مجموعة النتائج بأكملها، مكررًا في كل صف.
لعدم وجود ORDER BY، لا يوجد إطار تراكمي، ولذلك يكون الإطار الافتراضي هو التقسيم بأكمله. وهذا الإجمالي المكرر في كل صف هو بالضبط المقام الذي تحتاج إليه لحساب النسبة من الإجمالي.
SELECT
category,
amount,
SUM(amount) OVER () AS grand_total
FROM category_sales;حساب النسبة من الإجمالي
اقسم قيمة الصف على الإجمالي الكلي المحسوب باستخدام نافذة، ثم اضرب الناتج في 100. وحوّل النوع إلى عشري حتى لا تؤدي القسمة الصحيحة إلى اقتطاع الناتج وتحويله إلى صفر.
يستبدل هذا الاستعلام ذو المرور الواحد النمط القديم الذي يستخدم استعلامًا فرعيًا لحساب الإجمالي ثم يربطه مجددًا بصفوف التفاصيل. فهو أقصر وأسرع وأسهل قراءة.
SELECT
category,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (),
2
) AS pct_of_total
FROM category_sales;فخ القسمة الصحيحة
هذا من الأسئلة الخادعة الكلاسيكية في المقابلات: في العديد من قواعد البيانات، يؤدي استخدام amount / total على أعمدة صحيحة إلى قسمة صحيحة، ولذلك تصبح النتيجة الأقل من 1 مساوية للصفر.
أصلح ذلك بالضرب في 100.0 (وهو ثابت رقمي) أولًا، أو بتحويل نوع أحد المعاملين: amount::numeric / total. إن نسيان ذلك يعيد عمودًا من الأصفار، وهو ما يلاحظه المحاورون فورًا.
SELECT
category,
amount * 1.0 / SUM(amount) OVER () AS share,
CAST(amount AS DECIMAL) / SUM(amount) OVER () AS share_alt
FROM category_sales;النسبة من الإجمالي داخل مجموعة
أضف PARTITION BY لجعل حصة كل صف محسوبة بالنسبة إلى مجموعته بدلًا من الجدول بأكمله. فمثلًا، يمكن حساب النسبة المئوية لمبيعات كل منتج من مبيعات منطقته الخاصة.
يُعاد الآن ضبط المقام SUM(amount) OVER (PARTITION BY region) لكل منطقة، ولذلك يكون مجموع النسب داخل كل منطقة مساويًا لـ 100.
SELECT
region,
product,
amount,
ROUND(
100.0 * amount / SUM(amount) OVER (PARTITION BY region),
2
) AS pct_of_region
FROM regional_sales;النسبة التراكمية من الإجمالي
اجمع بين بسط تراكمي ومقام ثابت للحصول على الحصة التراكمية من الإجمالي، أي مقدار ما تراكم من الإجمالي الكلي حتى كل صف.
يستخدم البسط ORDER BY (تراكميًا)، بينما يستخدم المقام OVER () فارغة (الإجمالي الكلي). ويصل الصف الأخير دائمًا إلى 100%.
SELECT
sale_date,
amount,
ROUND(
100.0 * SUM(amount) OVER (ORDER BY sale_date)
/ SUM(amount) OVER (),
2
) AS running_pct
FROM daily_sales;CUME_DIST: التوزيع التراكمي
يوفر SQL دالة مدمجة للتوزيع التراكمي، وهي CUME_DIST(). وتُرجع نسبة الصفوف التي تكون قيمة ORDER BY فيها أقل من قيمة الصف الحالي أو مساوية لها، وهي قيمة ضمن (0, 1].
وعلى خلاف الحصة التراكمية لمبلغ محسوبة يدويًا، تتعلق CUME_DIST بموضع الصف، إذ تجيب عن السؤال: "ما نسبة الصفوف التي تقع عند هذه القيمة أو دونها؟" وهذا مفيد في التقارير الشبيهة بتقارير المئينات.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cume_dist
FROM exam_results;PERCENT_RANK والفرق بينها
توجد دالة قريبة منها هي PERCENT_RANK()، وتُعرّف بالصيغة (rank - 1) / (total_rows - 1)، ويتراوح ناتجها من 0 إلى 1.
الفرق المهم في مقابلة العمل هو أن CUME_DIST تضم الصف الحالي في بسطها ("عند القيمة أو دونها")، بينما تمثل PERCENT_RANK الرتبة النسبية التي تبدأ من 0 للصف الأول. وتعطي الدالتان قيمًا مختلفة، والخلط بينهما خطأ شائع.
SELECT
score,
CUME_DIST() OVER (ORDER BY score) AS cd,
PERCENT_RANK() OVER (ORDER BY score) AS pr
FROM exam_results;تحليل باريتو / 80-20
تتيح النسبة التراكمية من الإجمالي إجراء تحليل باريتو: "أي كبار العملاء يمثلون 80% من الإيرادات؟" رتّب تنازليًا حسب المبلغ، واحسب الحصة التراكمية، ثم صفِّ النتائج عند النقطة التي تتجاوز فيها الحصة التراكمية 80% لأول مرة.
لأن نتائج دوال النوافذ لا يمكن وضعها في WHERE، فغلّف الحساب داخل CTE وأجرِ التصفية في الاستعلام الخارجي؛ وهذه هي القاعدة نفسها التي تنطبق على كل دالة نافذة.
WITH ranked AS (
SELECT
customer_id,
revenue,
SUM(revenue) OVER (ORDER BY revenue DESC)
/ SUM(revenue) OVER () AS running_share
FROM customer_revenue
)
SELECT *
FROM ranked
WHERE running_share <= 0.80;التقريب والتسوية
انتبه: قد يؤدي تقريب كل نسبة مئوية إلى منزلتين عشريتين إلى جعل مجموع العمود 99.99 أو 100.01 بدلًا من 100 تمامًا. قد يسألك المحاورون كيف تضمن أن مجموع الأجزاء يساوي الكل.
الإجابات الشائعة: التقريب عند العرض فقط، والاحتفاظ بالدقة الكاملة لإجراء الحسابات، أو تطبيق تعديل الباقي الأكبر على صف واحد. المهم هو تسمية المشكلة أكثر من أهمية الحل نفسه.
خلاصة نقاط المقابلة
النقاط الأساسية التي ينبغي التعبير عنها شفهيًا:
SUM(x) OVER ()من دون ORDER BY = الإجمالي الكلي في كل صف.- اضرب في
100.0لتجنب القسمة الصحيحة. - استخدم
PARTITION BYلحساب حصة كل مجموعة. - البسط التراكمي على مقام يمثل الإجمالي الكلي = الحصة التراكمية.
- استخدم
CUME_DISTوPERCENT_RANKللتوزيع، واعرف الفرق بينهما. - ضع الاستعلام داخل CTE لإجراء التصفية وفق Pareto أو وفق عتبة.
تحقق سريع
كيف تحصل على الإجمالي الكلي لمجموعة النتائج بأكملها في كل صف؟
مراجعة: التوزيع والنسبة من الإجمالي
تحسب النسبة من الإجمالي بقسمة قيمة الصف على SUM(x) OVER ()، وهو الإجمالي الكلي المعاد في كل صف؛ احرص دائمًا على الضرب في 100.0 لتجنب القسمة الصحيحة، وأضف PARTITION BY لحساب الحصص لكل مجموعة. ويؤدي استخدام بسط تراكمي على مقام يمثل الإجمالي الكلي إلى الحصول على حصة تراكمية تنتهي عند 100%، وهذا هو أساس تحليل Pareto.
بالنسبة إلى التوزيع القائم على الموضع، استخدم CUME_DIST وPERCENT_RANK، وتذكّر ملاحظة تسوية التقريب. بهذا تكتمل موضوعات الإجماليات التراكمية والمتوسطات المتحركة.
الأسئلة الشائعة
هل درس «التوزيع التراكمي والنسبة من الإجمالي» مجاني؟
نعم — نص درس «التوزيع التراكمي والنسبة من الإجمالي» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة SQL Interview Prep، انتقل إلى CoddyKit PRO. تتضمن دورة SQL Interview Prep 4 دروس في المجموع.
ماذا ستتعلم في «التوزيع التراكمي والنسبة من الإجمالي»؟
حساب النسب التراكمية وحصة الإجمالي داخل الأقسام تتمرن على SQL Interview Prep مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.
هل أحتاج إلى خبرة سابقة لأبدأ SQL Interview Prep؟
لا تُشترط خبرة سابقة. SQL Interview Prep على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.
كم من الوقت يستغرق درس «التوزيع التراكمي والنسبة من الإجمالي»؟
معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.
هل يمكنني كتابة وتشغيل أكواد في درس SQL Interview Prep هذا؟
نعم. كل درس في SQL Interview Prep يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.
جميع الدروس في هذه الدورة
- المجاميع التراكمية باستخدام إطارات النوافذ
- تأطير ROWS مقابل RANGE
- المتوسطات المتحركة عبر نافذة منزلقة
- التوزيع التراكمي والنسبة من الإجمالي