لماذا لا يصلح SUM(DISTINCT) دائما لتصحيح المجموع بعد JOIN؟

متقدمقراءة دقيقةآخر تحديث 2 أكتوبر 2026

SQL قواعد البيانات

الإجابة

قد يتكرر صف الطلب بعد ربطه بجدول تفاصيل يحتوي على عدة عناصر لكل طلب. إذا جمعت مبلغ الطلب بعد هذا الربط، فسيدخل المبلغ مرة لكل عنصر. قد يبدو استخدام SUM(DISTINCT amount) حلا، لكنه يزيل تكرار الأرقام، وليس تكرار الطلبات، ولذلك قد يعطي نتيجة ناقصة.

مثال

SELECT SUM(o.amount) AS total_amount
FROM orders AS o
WHERE EXISTS (
  SELECT 1
  FROM order_items AS i
  WHERE i.order_id = o.id
);

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

يمكن أيضا إعداد نتيجة وسيطة تحتوي على صف واحد لكل معرف طلب قبل التجميع النهائي. المهم هو الحفاظ على هوية العملية التي تريد عدها أو جمعها، بدلا من اعتبار تشابه المبالغ دليلا على تكرار العملية.

باختصار: عالج تكرار الصفوف حسب معرف الطلب، لأن إزالة تكرار المبلغ قد تحذف مساهمات صحيحة.

هل تريد تعلّم SQL خطوة بخطوة مع تمارين عملية؟ تابع مسار SQL من الأساسيات للاحتراف.

اختبر فهمك

ما قيمة naive_total ثم distinct_total في الاستعلام التالي؟

CREATE TABLE orders (
  id INT PRIMARY KEY,
  amount INT NOT NULL
);
CREATE TABLE order_items (
  id INT PRIMARY KEY,
  order_id INT NOT NULL
);
INSERT INTO orders VALUES (1, 100), (2, 100);
INSERT INTO order_items VALUES (10, 1), (11, 1), (12, 2);
SELECT SUM(o.amount) AS naive_total,
       SUM(DISTINCT o.amount) AS distinct_total
FROM orders AS o
JOIN order_items AS i ON i.order_id = o.id;