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

PostgreSQL / الأساسي: الأسس العلاقية / الدرس 5

المجاميع ومراحل التقرير

أنتج أعداداً ومجاميع وملخصات شرطية موثوقة، وافصل تصفية الصفوف عن المجموعات وميز الخلو عن الصفر.

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

أهداف الدرس

  • شرح COUNT وSUM وGROUP BY وHAVING وFILTER.
  • التحقق من مستوى المجموعة وNULL وترتيب النتيجة.

يغير التجميع معنى الصف

يمثل الصف دفعة قبل التجميع وملخص عميل بعد GROUP BY customer_id. يجب أن يتبع كل عمود معروض قاعدة تجميع صحيحة، فلا تنقل تساهل نظام آخر. تصفي WHERE المدخلات وتختار HAVING المجموعات المكتملة. يختلف مجموع عميل فوق خمسين عن إزالة كل دفعة لا تتجاوز خمسين أولاً؛ وضح الفرق قبل SQL.

لاحظ أثر NULL في مدخلات التجميع

تحوي العينة مبلغين معلومين للعميل 1 ومبلغاً NULL للعميل 2. تعد COUNT(*) الصفوف وتعد COUNT(amount) القيم غير الفارغة وتتجاهل SUM الفراغ ثم تعيد NULL إذا غابت كل القيم المعلومة. يميز ذلك دفعة مجهولة عن غياب صفوف. تعرض COALESCE صفراً وفق سياسة التقرير، وقد يخفي تطبيقها المبكر حقيقة مالية مفقودة تحتاج تحقيقاً.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
SELECT customer_id, COUNT(*) AS records,
 COUNT(amount) AS known_amounts, SUM(amount) AS total
FROM (VALUES (1, 10::numeric), (1, 15::numeric),
             (2, NULL::numeric)) AS p(customer_id, amount)
GROUP BY customer_id ORDER BY customer_id;
الناتج المتوقع
customer_id | records | known_amounts | total
1           | 2       | 2             | 25
2           | 1       | 0             | NULL

المجموع NULL نتيجة مجهولة مقصودة وليس صفراً مختلقاً.

توثق FILTER التجميع الشرطي

تدعم PostgreSQL FILTER للمجاميع، فتعد المدفوع والمعلق دون تكرار الربط أو تقييد مجموعة التقرير كلها بشرط واحد. تعد COUNT(*) FILTER الصفوف المطابقة وقد تبقى SUM(amount) FILTER بقيمة NULL عند غياب المبالغ المعلومة. تخضع الشروط للمنطق الثلاثي؛ المجهول ليس true. حدد معنى الإلغاء والمرتجع والحالة الغائبة قبل نشر مقياس تشغيلي.

احسب مقياسين من عينة واحدة

تحتوي العلاقة صفين مدفوعين ومعلقاً. العددان اثنان وواحد ومجموع المدفوع ثلاثون. تحذف WHERE state = paid المعلق قبل حسابه، بينما تغير FILTER مدخل كل دالة وتبقي المجموعة المشتركة. العينة حرفية مستقرة ولا تدعي إنتاجية أو مجاميع إنتاجية مرصودة.

sql SQL توضيحي؛ النتائج المتوقعة مستنتجة وليست قياسات.
SELECT COUNT(*) FILTER (WHERE state = 'paid') AS paid_count,
 COUNT(*) FILTER (WHERE state = 'pending') AS pending_count,
 SUM(amount) FILTER (WHERE state = 'paid') AS paid_total
FROM (VALUES ('paid', 10), ('paid', 20), ('pending', 5))
 AS p(state, amount);
الناتج المتوقع
paid_count | pending_count | paid_total
2          | 1             | 30

تُشتق المقاييس الثلاثة من سجلات الإدخال نفسها.

يحتاج الترتيب والحساب مراجعة

لا تضمن GROUP BY ترتيباً، فأضف ORDER BY للتصدير. تبتر قسمة عددين صحيحين في PostgreSQL فحول أحدهما إلى numeric للنسب. تتجاهل AVG قيم NULL فيختلف مقامها عن COUNT(*). صالح تقريراً صغيراً يدوياً مع الفراغ والمبالغ المتكررة. نجاح التنفيذ لا يثبت صحة السؤال عندما يغيب تعريف المجموعة أو المقام.

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

column must appear in GROUP BY (42803)

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

تصبح النسبة صفراً خلاف المتوقع

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

يعرض الربط الخارجي واحداً لفرع خالٍ

لماذا يحدث؟
عدت COUNT(*) صف الأصل المحفوظ.
كيف تصلحه؟
عد مفتاح الفرع غير الفارغ عند عد الفروع.
كيف تتجنب تكراره؟
ضمّن أصلاً بلا فروع في عينة التجميع.

اختبر فهمك

1. يحوي التقرير 10 وNULL و20. قارن COUNT(*) وCOUNT(amount) وSUM وAVG.

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

COUNT(*) تساوي 3 وCOUNT(amount) تساوي 2 وSUM تساوي 30 وAVG تساوي 15 للقيمتين المعلومتين. تعطي إضافة صفر بدلاً من NULL متوسطاً 10 ومعنى مختلفاً. حدد هل السجل ناقص أم غياب مقصود أم حدث صفري قبل اختيار المقام.

2. تستخدم النسبة successes / attempts وهما صحيحان. قدم تعبيراً مناسباً وفسر انعدام المحاولات.

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

استخدم successes::numeric / NULLIF(attempts, 0). يحفظ التحويل الكسر وتمنع NULLIF القسمة بالصفر. ينتج المقام الصفري NULL بمعنى نسبة غير معرفة لا نجاح صفري مقاس. اعرضها غير متاحة ولا تقل 0% كأن محاولات فاشلة حدثت.

sql حل محلول وفق الافتراضات الاصطناعية المحددة.
SELECT 1::numeric / NULLIF(4, 0) AS ratio;
الناتج المتوقع
ratio
0.25

أهم ما تعلمته

  • يجعل فهم NULL والمقام والمستوى المجاميع قابلة للتفسير.
  • تعمل FILTER وHAVING في مراحل تقرير مختلفة.

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