الدرس 6 من 10

تسمية النتائج الوسيطة

هدف الدرس

الجملة WITH وتسمية الخطوات

01

الشرح

حين يكبر الاستعلام الفرعي وتتداخل أجزاؤه تصبح قراءته أصعب من كتابته، وهنا يساعدك WITH، فهو يعطي النتيجة الوسيطة اسمًا في أول الاستعلام، ثم تقرأ منها كأنها جدول: WITH sales AS (SELECT ...) SELECT ... FROM sales.

ويمكنك أن تستعمل هذا الاسم أكثر من مرّة، فسؤال «ما المنتجات التي يزيد إيرادها على المتوسّط؟» يحتاج إلى الإيرادات مرّتين، مرّة لتعرضها ومرّة لتحسب متوسّطها، ومن دون WITH ستكتب التجميع نفسه مرّتين، ثم تصلح خطأً في نسخة وتنساه في الأخرى.

وWITH والاستعلام الذي بعده جملة واحدة، فلو وضعت بينهما فاصلة منقوطة لانقطعت الجملة وظهر خطأ، ولا يبقى الاسم متاحًا بعد نهاية هذه الجملة.

02

المطلوب

احسب في WITH sales إيراد كل منتج، وهو مجموع qty * price لكل بنوده، ثم اعرض منه product وrevenue للمنتجات التي يزيد إيرادها على متوسّط الإيرادات، مرتّبة من الأعلى إيرادًا.

الفحوص

5 فحوص
  1. العمودان product وrevenue
  2. إيراد كل منتج صحيح
  3. كل المنتجات فوق متوسّط الإيرادات
  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 فحوص في بطاقة «المطلوب».