الدرس 3 من 10

المجموع لكل عميل

هدف الدرس

الربط بـ JOIN مع التجميع بـ GROUP BY

01

الشرح

تجيب عن سؤال «كم أنفق كل عميل؟» بخطوتين، فتربط العملاء بطلباتهم أولًا، ثم تجمع صفوف كل عميل بـGROUP BY customers.id وتحسب SUM(orders.total). ونجمّع هنا بالمعرّف (id) لا بالاسم، لأنّ الأسماء قد تتكرّر.

ولكي يظهر من لم يطلب شيئًا، استعمل LEFT JOIN كما في الدرس السابق.

لكنّ SUM يُرجع NULL لا صفرًا إذا كانت القيم كلها NULL، ولذلك ضعه داخل COALESCE(SUM(orders.total), 0)، لأنّ COALESCE تُرجع أول قيمة ليست NULL من القيم التي تعطيها لها.

02

المطلوب

اعرض لكل العملاء name وspent، وهو مجموع طلبات العميل أو صفر لمن ليس له طلبات، ورتّبهم من الأكثر إنفاقًا إلى الأقل.

الفحوص

5 فحوص
  1. العمودان name وspent
  2. كل العملاء موجودون
  3. من لم يطلب شيئًا له صفر لا NULL
  4. مجموع كل عميل صحيح
  5. مرتّبة من الأكثر إنفاقًا
الجداول المتاحة في هذا الدرس
CREATE TABLE customers (
  id   INTEGER PRIMARY KEY,
  name TEXT NOT NULL,
  city TEXT NOT NULL
);

CREATE TABLE orders (
  id          INTEGER PRIMARY KEY,
  customer_id INTEGER REFERENCES customers(id),
  total       INTEGER NOT NULL,
  placed_on   TEXT    NOT NULL
);

INSERT INTO customers (id, name, city) VALUES
  (1, 'ليان', 'الرياض'),
  (2, 'خالد', 'جدة'),
  (3, 'ريم',  'الدمام'),
  (4, 'فهد',  'الرياض');

INSERT INTO orders (customer_id, total, placed_on) VALUES
  (1, 120, '2026-09-01'),
  (1,  80, '2026-09-12'),
  (2, 300, '2026-09-03'),
  (3,  45, '2026-09-20'),
  (2,  60, '2026-09-25');

INSERT INTO customers (id, name, city) VALUES (5, 'سارة', 'جدة');

CREATE TABLE products (
  id    INTEGER PRIMARY KEY,
  name  TEXT    NOT NULL,
  price INTEGER NOT NULL
);

CREATE TABLE order_items (
  id         INTEGER PRIMARY KEY,
  order_id   INTEGER REFERENCES orders(id),
  product_id INTEGER REFERENCES products(id),
  qty        INTEGER NOT NULL
);

INSERT INTO products (id, name, price) VALUES
  (1, 'دفتر',      15),
  (2, 'قلم',        5),
  (3, 'حقيبة',     90),
  (4, 'آلة حاسبة', 60),
  (5, 'مصباح',    100);

INSERT INTO order_items (order_id, product_id, qty) VALUES
  (1, 3, 1), (1, 1, 2),
  (2, 4, 1), (2, 2, 4),
  (3, 3, 2), (3, 4, 2),
  (4, 1, 3),
  (5, 1, 2), (5, 2, 6);
query.sql
المخرجاتSQLite (sql.js)

نحمّل بيئة SQLite الآن.

–/5

يبدأ الفحص حين تجهز البيئة.

تجد 5 فحوص في بطاقة «المطلوب».