الدرس 3 من 10
المجموع لكل عميل
- 13 دقيقة
- 5 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
JOIN مع GROUP BY
01
الشرح
«كم أنفق كل عميل؟» سؤال من خطوتين: اربط العملاء بطلباتهم، ثم اجمع صفوف كل عميل بـGROUP BY customers.id واحسب SUM(orders.total). والتجميع بالمعرّف لا بالاسم، فالأسماء قد تتكرّر.
ولكي يظهر من لم يطلب شيئًا، اربط بـLEFT JOIN كما في الدرس السابق.
لكنّ SUM على قيم كلها NULL يُرجع NULL لا صفرًا. لفّه إذن بـCOALESCE(SUM(orders.total), 0): تُرجع COALESCE أوّل قيمة غير NULL من قائمتها.
02
المطلوب
اعرض name وspent — مجموع طلبات العميل، وصفرًا لمن لا طلبات له — لكل العملاء، من الأكثر إنفاقًا.
معايير التصحيح
5 معايير- العمودان name و spent
- كل العملاء حاضرون
- صفر لا NULL لمن لم يطلب
- مجموع كل عميل صحيح
- من الأكثر إنفاقًا
الجداول المتاحة في هذا الدرس
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);