GROUP BY और HAVING के साथ औसत फ़िल्टर
प्रति प्रोडक्ट औसत कीमत की गणना करने और एक सीमा से कम औसत वाले प्रोडक्ट्स चुनने के लिए GROUP BY के साथ AVG() और HAVING का उपयोग करें।
उदाहरण: टेबल बनाना और डेटा इन्सर्ट करना
mysql> CREATE TABLE DemoTable848(
ProductId INT,
ProductPrice INT
);
Query OK, 0 rows affected (1.20 sec)
रिकॉर्ड्स इन्सर्ट करना (एक ही प्रोडक्ट के लिए कई कीमतें)
mysql> INSERT INTO DemoTable848 VALUES
(100,30),(101,50),(100,40),(101,25),(100,20);
Query OK, 5 rows affected (...)
सभी रिकॉर्ड्स देखना
mysql> SELECT * FROM DemoTable848;
+-----------+--------------+ | ProductId | ProductPrice | +-----------+--------------+ | 100 | 30 | | 101 | 50 | | 100 | 40 | | 101 | 25 | | 100 | 20 | +-----------+--------------+ 5 rows in set (0.00 sec)
औसत कीमत < 35 वाले प्रोडक्ट्स की क्वेरी
mysql> SELECT ProductId, AVG(ProductPrice)
FROM DemoTable848
GROUP BY ProductId
HAVING AVG(ProductPrice) < 35;
परिणाम
+-----------+-------------------+ | ProductId | AVG(ProductPrice) | +-----------+-------------------+ | 100 | 30.0000 | +-----------+-------------------+ 1 row in set (0.00 sec)
क्वेरी व्याख्या
GROUP BY ProductId- प्रत्येक प्रोडक्ट के लिए पंक्तियों को ग्रुप करता हैAVG(ProductPrice)- प्रत्येक ग्रुप का औसत कीमतHAVING AVG(ProductPrice) < 35- ग्रुपिंग के बाद फ़िल्टर करता है (WHERE ग्रुपिंग से पहले)- ProductId 100: (30+40+20)/3 = 30 ✓
- ProductId 101: (50+25)/2 = 37.5 ✗
WHERE vs HAVING
| पहलू | WHERE | HAVING |
|---|---|---|
| लागू होता है | ग्रुपिंग से पहले (पंक्ति स्तर) | ग्रुपिंग के बाद (ग्रुप स्तर) |
| एग्रीगेट फंक्शन | उपयोग नहीं कर सकते | उपयोग कर सकते हैं |
| कॉलम एलियास | उपयोग नहीं कर सकते | उपयोग कर सकते हैं (MySQL में) |
एलियास के साथ HAVING (MySQL अनुमति देता है)
SELECT ProductId, AVG(ProductPrice) AS AvgPrice FROM DemoTable848 GROUP BY ProductId HAVING AvgPrice < 35;
अधिक जटिल उदाहरण
औसत और न्यूनतम ऑर्डर मूल्य सीमा
SELECT ProductId, AVG(ProductPrice) AS AvgPrice, MIN(ProductPrice) AS MinPrice FROM DemoTable848 GROUP BY ProductId HAVING AvgPrice < 35 AND MinPrice > 15;
कम से कम N ऑर्डर वाले प्रोडक्ट्स
SELECT ProductId, AVG(ProductPrice), COUNT(*) AS OrderCount FROM DemoTable848 GROUP BY ProductId HAVING COUNT(*) >= 3;
विंडो फंक्शन अल्टरनेटिव (MySQL 8.0+)
SELECT DISTINCT ProductId, AVG(ProductPrice) OVER (PARTITION BY ProductId) AS AvgPrice FROM DemoTable848 WHERE AVG(ProductPrice) OVER (PARTITION BY ProductId) < 35; -- नोट: WHERE में विंडो फंक्शन अनुमत नहीं, सबक्वेरी/CTE आवश्यक
सही विंडो फंक्शन दृष्टिकोण
SELECT ProductId, AvgPrice FROM (
SELECT ProductId, AVG(ProductPrice) OVER (PARTITION BY ProductId) AS AvgPrice
FROM DemoTable848
) t GROUP BY ProductId, AvgPrice
HAVING AvgPrice < 35;