محتويات الدورة

قاعدة بيانات أوراكل / الأساسي: أسس العلاقات والمعاملات / الدرس 5

التجميع والمجاميع الموثوقة

احسب ملخصات الشحن بوحدات واضحة وقواعد للقيم الغائبة وتسميات للمجاميع الفرعية.

وقت القراءة التقريبي: 4 دقيقةتاريخ مراجعة المحتوى
في هذه الصفحة

أهداف الدرس

  • ميّز شروط المجموعات من شروط الصفوف.
  • ابنِ أعداداً شرطية وميّز صفوف المجاميع الفرعية المولدة.

حدّد المقام قبل الدالة

يختلف متوسط الرسم لكل شحنة عن متوسط مبلغ سطر الفاتورة رغم استخدام AVG في الحالتين. حدّد تفصيل المدخلات والمقام قبل اختيار الدالة. يحسب COUNT(*) الصفوف، وCOUNT(charge) الرسوم غير NULL، ويتجاهل SUM مدخلات NULL بدلاً من معاملتها كلها صفراً. عند غياب المدخلات دون تجميع يعيد COUNT صفراً وSUM قيمة NULL. استبدالها بصفر قرار عرض تجاري يجب ألا يخفي خلو البيانات أو إخفاق وصول تغذية المصدر.

احسب الفئات دون فقدان المقام

يحافظ التجميع الشرطي على المجتمع المرئي أثناء حساب فئة داخله. توجد في المثال ثلاث شحنات وسجلان مسلّمان ومجموع رسوم معلومة يساوي خمسة عشر. لا تسهم الرسوم الغائبة في SUM. يعتمد COUNT(CASE WHEN ... THEN 1 END) على تحوّل ELSE المحذوف إلى NULL. يعطي SUM مع ELSE 0 عدد الفئة نفسه لمجموعة غير خالية، لكن نتيجة المدخلات الخالية تظل وفق دلالات SUM. اختر أسلوباً واشرحه بدلاً من ترك سلوك NULL للصدفة.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
WITH shipments AS (
 SELECT 'delivered' status, 10 charge FROM dual UNION ALL
 SELECT 'held', 5 FROM dual UNION ALL
 SELECT 'delivered', NULL FROM dual
)
SELECT COUNT(*) AS shipments,
       COUNT(CASE WHEN status = 'delivered' THEN 1 END) AS delivered,
       SUM(charge) AS known_charge
FROM shipments;
الناتج المتوقع
SHIPMENTS | DELIVERED | KNOWN_CHARGE
3         | 2         | 15

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

يجيب WHERE وHAVING عن سؤالين مختلفين

يحذف WHERE صفوف المصدر قبل التجميع، ويحذف HAVING المجموعات بعد حسابها. لعرض العملاء الذين تتجاوز رسوم شحناتهم في أكتوبر مئة، صفِّ أكتوبر في WHERE ثم استخدم HAVING SUM(charge) > 100. تصفية الرسوم الفردية التي تتجاوز المئة أولاً سؤال مختلف ويستبعد الرسوم الصغيرة من الإجمالي. يجب أن يكون التعبير المعروض مجمعاً أو ضمن مفاتيح التجميع أو صحيحاً وفق قواعد أوراكل؛ فلا تستورد سماح محرك آخر باختيار عمود عشوائي خارج التجميع. يحمي خطأ الصياغة هنا من تقرير ملتبس.

ميّز أبعاد NULL من المجاميع الفرعية

ينشئ ROLLUP وGROUPING SETS مستويات تجميع متعددة. قد يكون معرّف العميل NULL غياباً حقيقياً في المصدر أو موضعاً مولداً للإجمالي العام. يميّز GROUPING(customer_id) بينهما: واحد يعني أن العمود اختُزل، وصفر يعني أنه ضمن المستوى. لا تسمِّ كل NULL إجمالياً. احتفظ بعلامة التجميع في عقد البيانات إذا استهلكت النتائجَ ورقة عمل أو واجهة؛ فقد يتطابق النص المرئي مع اسم عميل حقيقي. طابق كل مستوى مستقلاً مع المجتمع المصفّى نفسه.

sql مثال تقني توضيحي؛ النتائج المنطقية مستنتجة ولم تُختبر على المحرك.
SELECT customer_id, GROUPING(customer_id) AS is_total, SUM(charge) AS total_charge
FROM shipments
GROUP BY GROUPING SETS ((customer_id), ());

تُعاد مجموعة لكل عميل ومجموعة عامة واحدة. يميّز is_total الصف العام حتى إذا كان customer_id في المصدر NULL.

قرّب عند الحد المحاسبي الموثق

قد يختلف SUM(ROUND(charge,2)) عن ROUND(SUM(charge),2) إذا احتوت القيم أكثر من منزلتين عشريتين. يقرّب الأول كل شحنة والثاني المجموع. لا يصح أحدهما دائماً دون قاعدة محاسبية. ويحتاج تحويل العملات إلى تاريخ سعر وهوية عملة واتجاه تقريب موثق. احتفظ بحسابات NUMBER الدقيقة للمبالغ العشرية المحدودة ولا تحولها إلى نصوص منسقة قبل الجمع. اختبر بقيم صغيرة قرب أنصاف السنتات، وفترة خالية، وعميل كل رسومه غائبة.

الأخطاء الشائعة وإصلاحها

ORA-00979

لماذا يحدث؟
يوجد تعبير معروض غير مجمع وغير داخل مفاتيح التجميع بصورة مناسبة.
كيف تصلحه؟
اختر مفتاح المجموعة المقصود أو دالة تجميع مبررة.
كيف تتجنب تكراره؟
اذكر مستوى تفصيل المخرجات قبل إضافة أعمدة وصفية.

نسبة التسليم أعلى مما ينبغي

لماذا يحدث؟
أزال WHERE غير المسلّم قبل حساب المقام.
كيف تصلحه؟
احتفظ بالمجتمع المستهدف كاملاً واستخدم التجميع الشرطي.
كيف تتجنب تكراره؟
راجع البسط والمقام بوصفهما تعريفين تجاريين مستقلين.

يُسمّى العميل الغائب إجمالياً عاماً

لماذا يحدث؟
استُخدمت NULL علامة للمجموع الفرعي دون GROUPING.
كيف تصلحه؟
أدرج مؤشر التجميع وسمِّ الصفوف المولدة فقط.
كيف تتجنب تكراره؟
اختبر الأبعاد الحقيقية القابلة لـNULL مع مجموعات التجميع.

اختبر فهمك

1. للعميل رسوم 40 و40 و30. أي شرط يجد العملاء الذين يتجاوز مجموعهم 100؟

اعرض الحل المشروح

جمّع صفوف الشحنات الثلاثة حسب العميل وطبّق HAVING SUM(charge) > 100. يتأهل العميل بمجموع 110. أما WHERE charge > 100 فيستبعد الصفوف الثلاثة. طبّق شروط الفترة والوصول الصحيحة قبل التجميع واحتفظ بشرط الإجمالي بعده.

2. ماذا تحتفظ به واجهة تعيد مجاميع العملاء والإجمالي العام معاً؟

اعرض الحل المشروح

احتفظ بمعرّف العميل والقيمة المجمعة ومؤشر صريح لمستوى التجميع. معرّف NULL وحده ملتبس إذا أمكن غياب بيانات المصدر. حدّد هل تتحول المجاميع الخالية إلى صفر وهل يتم التقريب لكل شحنة أو بعد الجمع، ثم تحقق من احتفاظ المستهلكين بهذه الفروق.

أهم ما تعلمته

  • تعتمد صحة التجميع على التفصيل والمجتمع لا صياغة الدالة وحدها.
  • تحتاج المجاميع المولدة إلى بيانات وصفية صريحة عندما تكون NULL قيمة مشروعة.

المراجع الرسمية