الدرس 8 من 10

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

هدف الدرس

الدالة SUM مع OVER

01

الشرح

يجيب المجموع التراكمي عن سؤال «كم بلغت المبيعات حتى هذا اليوم؟»، ففي كل صفّ مبلغه مضافًا إليه مبالغ كل الصفوف التي قبله.

ويحسبه SUM(total) OVER (ORDER BY placed_on) دون أن يجمع الصفوف في صفّ واحد كما يفعل GROUP BY، فـORDER BY داخل OVER يحدّد ترتيب التراكم، فيكون لكل صفّ مجموع الصفوف من أول الترتيب حتى هذا الصفّ.

ولو حذفت ORDER BY من داخل القوسين لرأيت المجموع الكلّي نفسه في كل صفّ، لأنّ النافذة التي بلا ترتيب تشمل المجموعة كلها. أمّا ORDER BY في آخر الاستعلام فيرتّب طريقة العرض فقط، ولا يغني عن ترتيب النافذة.

02

المطلوب

اعرض لكل طلب placed_on وtotal وrunning، وهو المجموع التراكمي حتى ذلك الطلب، ورتّب النتيجة بالتاريخ.

الفحوص

5 فحوص
  1. الأعمدة placed_on وtotal وrunning
  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 فحوص في بطاقة «المطلوب».