تعرض بطاقة التقرير شرطة بدل إجمالي، فيطلب الفريق استبدالها بصفر. قبل تعديل العرض، اسأل: هل لم توجد صفوف ضمن الفترة، أم توجد سجلات لكن القيمة المطلوبة غير معروفة؟ تشابه الخانة لا يعني أن الحالتين تحملان المعنى نفسه في PostgreSQL.
ابدأ بسلوك التجميع
يوضح مرجع PostgreSQL للدوال التجميعية أن SUM تعيد null عندما لا توجد صفوف، بينما COUNT يعيد عددًا. COUNT(*) يحسب الصفوف، وCOUNT(column) يحسب القيم غير null. ويمكن استخدام COALESCE لاستبدال نتيجة null عند الحاجة؛ الحاجة هنا يجب أن يحددها معنى التقرير.
في مثال افتراضي لساعات مهام، لا تعني الساعات المجهولة أن الموظف عمل صفرًا. افصل معلومة «لم تصل قيمة» عن معلومة «قيمة محفوظة تساوي صفرًا». لا تُستخدم أرقام المثال لتقييم موظفين حقيقيين أو لاتخاذ قرار تشغيلي دون مراجعة البيانات.
قارن ثلاث نتائج معًا
- بلا صفوف مطابقة: عدد الصفوف0، وعدد القيم المعروفة0، والمجموع NULL.
- صفان بقيم مجهولة: عدد الصفوف2، وعدد القيم المعروفة0، والمجموع NULL.
- صفان بقيمتي صفر: عدد الصفوف2، وعدد القيم المعروفة2، والمجموع0.
يفترض هذا المثال تجميعًا واحدًا بلا GROUP BY، ودون ربط يولد صفوفًا إضافية. مع التجميع حسب فئة قد لا توجد مجموعة أصلًا، ومع LEFT JOIN قد يظهر صف ممتد بقيم null. أعد الاختبار على شكل الاستعلام الفعلي قبل تعميم قيم الحالات.
اختيار الصفر يحتاج سياسة واضحة
قد يناسب COALESCE(SUM(hours),0) بطاقة تقول «لا مهام في هذه الفترة»، لكنه قد يخفي نقص البيانات إن كانت الصفوف موجودة بلا ساعات. يمكن للواجهة عرض حالة مستقلة لنقص البيانات مع الإجمالي المعروف، بدل تحويل كل غياب إلى رقم مطمئن.
راجع الفلاتر قبل اتهام الحساب
في أنظمة ERP جهز عينات مستقلة لكل حالة، وسجل الفترة والفلاتر والصفوف المتوقعة. وتراجع الاختبارات التقنية الاستعلام والواجهة والتصدير معًا. لا تصلح بطاقة واحدة بينما يظل التصدير يفسر null بصورة مختلفة، ولا تغير سجلات التشغيل لتوافق نتيجة متوقعة سلفًا.




