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 BYWHERE समूहीकरण से पहले पंक्तियों को फ़िल्टर करता है; 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 समूह हटाता है।

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

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. कौन सी शर्त HAVING के बजाय WHERE में रहनी चाहिए?
    • SUM(amount) > 100
    • status = 'paid'
    • COUNT(*) >= 2
  3. SUM(CASE WHEN category = 'books' THEN amount ELSE 0 END) क्या गणना करता है?
    • सभी ऑर्डरों का कुल योग
    • केवल 'books' श्रेणी की पंक्तियों का कुल योग
    • 'books' श्रेणी की पंक्तियों की संख्या
    • 'books' के बाहर की पंक्तियों का कुल योग