صفِّ بياناتك بعد التجميع باستخدام HAVING، وحوِّل تخطيط بياناتك باستخدام CASE WHEN داخل دوال التجميع.
افتح هذا الدرس في Kodokonأنت تعرف بالفعل GROUP BY. تتناول هذه الوحدة ما يفصل الاستعلام الصحيح عن الاستعلام الاحترافي: التصفية بعد التجميع، والتجميعات الشرطية، والفهم المتين لترتيب التقييم. للتدرّب، افتح sqliteonline.com (محرّك SQLite) أو شغِّل sqlite3 في الطرفية: يوفّر كل درس تعليمات CREATE TABLE وINSERT التي تحتاجها. انسخ مجموعة البيانات هذه قبل تشغيل الأمثلة.
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');إن الترتيب المنطقي للتقييم هو المفتاح: FROM → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. تُصفّي WHERE الصفوف قبل التجميع، بينما تُصفّي HAVING المجموعات بعد حساب التجميعات. لهذا السبب فإن WHERE SUM(amount) > 90 غير قانونية: ففي مرحلة WHERE، لا وجود لأي مجموع بعد. هنا، نُبقي فقط العملاء الذين يتجاوز مجموع مدفوعاتهم 90 (المتوقَّع: alice وchloe).
SELECT customer,
COUNT(*) AS nb_orders,
SUM(amount) AS total
FROM orders
WHERE status = 'paid'
GROUP BY customer
HAVING SUM(amount) > 90;النمط الثاني الذي يجب معرفته هو التجميع الشرطي. فبإدراج CASE WHEN داخل SUM أو COUNT، تحسب عدة مقاييس في مرور واحد على الجدول، حيث يُشغّل المبتدئ ثلاثة استعلامات منفصلة. وهذه هي التقنية المعيارية لتحويل الصفوف إلى أعمدة.
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;