الدرس 6 من 10
تسمية النتائج الوسيطة
- 14 دقيقة
- 5 معايير للتصحيح
- 3 تلميحات
- إلى المطلوب
هدف الدرس
WITH: خطوات بأسماء
الشرح
حين يكبر الاستعلام الفرعي ويتداخل، تصير قراءته أصعب من كتابته. WITH يعطي النتيجة الوسيطة اسمًا في رأس الاستعلام، ثم تقرأ منها كأنها جدول: WITH sales AS (SELECT ...) SELECT ... FROM sales.
والاسم يُستعمل أكثر من مرّة. «المنتجات التي يزيد إيرادها على المتوسّط» تحتاج الإيرادات مرّتين: لتعرضها، ولتحسب متوسّطها. بلا WITH تكتب التجميع نفسه مرّتين، ثم تصلح خطأً في نسخة وتنساه في الأخرى.
وWITH والاستعلام الذي يليه جملة واحدة: فاصلة منقوطة بينهما تقطعها بخطأ، والاسم لا يعيش بعدها.
المطلوب
احسب في WITH sales إيراد كل منتج — مجموع qty * price لبنوده — ثم اعرض منه product وrevenue للمنتجات التي يزيد إيرادها على متوسّط الإيرادات، من الأعلى.
معايير التصحيح
5 معايير- العمودان product و revenue
- إيراد كل منتج صحيح
- كلها فوق متوسّط الإيرادات
- لا ينقص منتج مستحقّ
- من الأعلى إيرادًا
الجداول المتاحة في هذا الدرس
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);