समाधान: SUM() के साथ शर्तीय अभिव्यक्ति
किसी GROUP BY समूह में विशिष्ट मान की उपस्थिति जांचने के लिए SUM() के साथ IF() या बूलियन अभिव्यक्ति का उपयोग करें।
सिंटैक्स
SELECT
groupColumn,
IF(SUM(targetColumn = 'value'), 'YES', 'NO') AS hasValue
FROM yourTableName
GROUP BY groupColumn;
व्यावहारिक उदाहरण
टेबल बनाना और डेटा डालना
mysql> CREATE TABLE GroupbygroupDemo (
-> UserId INT,
-> UserName VARCHAR(20)
-> );
mysql> INSERT INTO GroupbygroupDemo VALUES
-> (10, 'John'), (10, 'Carol'), (10, 'Carol'),
-> (20, 'David'),
-> (30, 'John'), (30, 'David'), (30, 'Mike');
डेटा (7 पंक्तियाँ)
| UserId | UserName |
|---|---|
| 10 | John |
| 10 | Carol |
| 10 | Carol |
| 20 | David |
| 30 | John |
| 30 | David |
| 30 | Mike |
क्वेरी: प्रत्येक UserId समूह में 'David' की उपस्थिति जांचना
mysql> SELECT
-> UserId,
-> IF(SUM(UserName = 'David'), 'YES', 'NO') AS Correct_Name_David
-> FROM GroupbygroupDemo
-> GROUP BY UserId;
परिणाम
| UserId | Correct_Name_David |
|---|---|
| 10 | NO |
| 20 | YES |
| 30 | YES |
व्याख्या
UserName = 'David'प्रत्येक पंक्ति के लिए 1 (सत्य) या 0 (असत्य) लौटाता हैSUM()इन 1 और 0 को जोड़ता है = 'David' की घटनाओं की संख्याIF(SUM(...) > 0, 'YES', 'NO')- यदि योग > 0 तो मौजूद है- MySQL में शर्तीय संदर्भ में कोई भी गैर-शून्य मान TRUE होता है
वैकल्पिक सिंटैक्स
CASE WHEN का उपयोग
SELECT UserId,
CASE WHEN SUM(UserName = 'David') > 0 THEN 'YES' ELSE 'NO' END AS hasDavid
FROM GroupbygroupDemo
GROUP BY UserId;
MAX के साथ (बूलियन के लिए)
SELECT UserId,
MAX(UserName = 'David') AS hasDavid
FROM GroupbygroupDemo
GROUP BY UserId;
MAX(बूलियन) = 1 यदि कोई TRUE है, अन्यथा 0
EXISTS उपक्वेरी के साथ (अक्सर तेज़)
SELECT DISTINCT g1.UserId,
CASE WHEN EXISTS (
SELECT 1 FROM GroupbygroupDemo g2
WHERE g2.UserId = g1.UserId AND g2.UserName = 'David'
) THEN 'YES' ELSE 'NO' END AS hasDavid
FROM GroupbygroupDemo g1;
उपयोग के मामले
- फीचर फ्लैग जांच: क्या समूह में विशेष अधिकार वाला उपयोगकर्ता है?
- डेटा गुणवत्ता: क्या प्रत्येक ग्राहक के पास आवश्यक दस्तावेज़ प्रकार है?
- सेगमेंटेशन: क्या उपयोगकर्ता समूह में प्रीमियम सदस्य है?