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;दूसरा अवश्य जानने योग्य पैटर्न है शर्तयुक्त एग्रीगेट। SUM या COUNT के अंदर एक CASE WHEN डालकर, आप टेबल पर एक ही बार गुज़रते हुए कई मेट्रिक की गणना कर लेते हैं, जबकि एक शुरुआती व्यक्ति तीन अलग-अलग क्वेरी चलाता। पंक्तियों को कॉलमों में पिवोट करने की यह मानक तकनीक है।
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;