Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> MySQL

MySQL में HAVING AVG() से औसत कीमत से कम वाले प्रोडक्ट्स चुनना

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

पहलूWHEREHAVING
लागू होता हैग्रुपिंग से पहले (पंक्ति स्तर)ग्रुपिंग के बाद (ग्रुप स्तर)
एग्रीगेट फंक्शनउपयोग नहीं कर सकतेउपयोग कर सकते हैं
कॉलम एलियासउपयोग नहीं कर सकतेउपयोग कर सकते हैं (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;
  1. - MySQL में NOT IN से मान न होने वाली पंक्तियां चुनें

    NOT IN ऑपरेटर से विशिष्ट मानों को बाहर रखें कुछ मानों को छोड़कर बाकी पंक्तियां प्राप्त करने के लिए NOT IN() का उपयोग करें। टेबल बनाएं और डेटा डालें: mysql> create table DemoTable1991 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20) ); Query OK, 0 rows affected (0.61 se

  1. - MySQL में WHERE क्लॉज में तिथि घटाकर ROW कैसे चुनें?

    TIMESTAMPDIFF() फ़ंक्शन दो तिथियों के बीच अंतर (मिनट, घंटे, दिन आदि) निकालने के लिए: TIMESTAMPDIFF(UNIT, start_datetime, end_datetime) उदाहरण insert into demo42 values(2020-01-10 12:30:05), (2019-02-24 10:40:45), (2020-05-12 05:45:55), (2020-05-12 05:40:55), (2020-05-12 05:42:55); 5 मिनट के अंदर

  1. - MySQL में WHERE IN के साथ NULL मान कैसे संभालें?

    सिंटैक्स select yourColumnName1, yourColumnName2 from yourTableName where yourValue in(yourColumnName1, yourColumnName2) or yourColumnName1 is NULL; उदाहरण insert into demo60(first_name,last_name) values(John,Smith), (John,Doe), (null,Brown), (David,Miller), (David,Smith), (Chris,Brown); क्वेरी