Kodokon kodokon.com

جملة HAVING والتجميعات المتقدمة

صفِّ بياناتك بعد التجميع باستخدام HAVING، وحوِّل تخطيط بياناتك باستخدام CASE WHEN داخل دوال التجميع.

8 دقيقة · 3 أسئلة

افتح هذا الدرس في Kodokon

أنت تعرف بالفعل GROUP BY. تتناول هذه الوحدة ما يفصل الاستعلام الصحيح عن الاستعلام الاحترافي: التصفية بعد التجميع، والتجميعات الشرطية، والفهم المتين لترتيب التقييم. للتدرّب، افتح sqliteonline.com (محرّك SQLite) أو شغِّل sqlite3 في الطرفية: يوفّر كل درس تعليمات CREATE TABLE وINSERT التي تحتاجها. انسخ مجموعة البيانات هذه قبل تشغيل الأمثلة.

SQL
CREATE TABLE orders (
  id INTEGER PRIMARY KEY,
  customer TEXT NOT NULL,
  category TEXT NOT NULL,
  amount REAL NOT NULL,
  status TEXT NOT NULL
);

INSERT INTO orders (customer, category, amount, status)
VALUES
  ('alice', 'books', 42.0, 'paid'),
  ('alice', 'games', 55.0, 'paid'),
  ('alice', 'books', 18.5, 'refunded'),
  ('bruno', 'games', 70.0, 'paid'),
  ('bruno', 'books', 12.0, 'paid'),
  ('chloe', 'games', 95.0, 'paid'),
  ('chloe', 'books', 30.0, 'paid'),
  ('david', 'books', 8.0, 'refunded');
مجموعة بيانات هذا الدرس، شغِّلها أولًا.

إن الترتيب المنطقي للتقييم هو المفتاح: FROMWHEREGROUP BYHAVINGSELECTORDER BY. تُصفّي WHERE الصفوف قبل التجميع، بينما تُصفّي HAVING المجموعات بعد حساب التجميعات. لهذا السبب فإن WHERE SUM(amount) > 90 غير قانونية: ففي مرحلة WHERE، لا وجود لأي مجموع بعد. هنا، نُبقي فقط العملاء الذين يتجاوز مجموع مدفوعاتهم 90 (المتوقَّع: alice وchloe).

SQL
SELECT customer,
       COUNT(*) AS nb_orders,
       SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer
HAVING SUM(amount) > 90;
تُزيل WHERE الصفوف، وتُزيل HAVING المجموعات.

النمط الثاني الذي يجب معرفته هو التجميع الشرطي. فبإدراج CASE WHEN داخل SUM أو COUNT، تحسب عدة مقاييس في مرور واحد على الجدول، حيث يُشغّل المبتدئ ثلاثة استعلامات منفصلة. وهذه هي التقنية المعيارية لتحويل الصفوف إلى أعمدة.

SQL
SELECT customer,
  SUM(CASE WHEN category = 'books'
      THEN amount ELSE 0 END) AS books_total,
  SUM(CASE WHEN category = 'games'
      THEN amount ELSE 0 END) AS games_total
FROM orders
WHERE status = 'paid'
GROUP BY customer;
تحويل الصفوف → أعمدة في قراءة واحدة.

اختبار المعرفة

تأكّد من أنك تذكّرت النقاط الأساسية في هذا الدرس.

  1. بأي ترتيب منطقي يقيّم المحرّك هذه العبارات؟
    • WHERE → GROUP BY → HAVING
    • HAVING → WHERE → GROUP BY
    • GROUP BY → HAVING → WHERE
  2. أي شرط ينبغي أن يبقى في WHERE بدلًا من HAVING؟
    • SUM(amount) > 100
    • status = 'paid'
    • COUNT(*) >= 2
  3. ماذا يحسب SUM(CASE WHEN category = 'books' THEN amount ELSE 0 END)؟
    • مجموع كل الطلبات
    • مجموع الصفوف من فئة 'books' فقط
    • عدد الصفوف من فئة 'books'
    • مجموع الصفوف خارج 'books'