एसक्यूएल: एक ही टेबल / फ़ील्ड से गिनती है, लेकिन विभिन्न मान - एसक्यूएल, सबक्वायरी

अपने डेटाबेस प्रोजेक्ट में, मुझे ओलंपिक खेलों के कुछ डेटा के बारे में एक डेटाबेस बनाना था।

मुझे निम्नलिखित क्वेरी भी बनानी है:

विशिष्ट ओलंपिक के लिए पदक तालिका की गणना करेंउपयोगकर्ता द्वारा दिए गए गेम्स। पदक तालिका में होना चाहिए देश का आईओसी कोड उसके बाद स्वर्ण, रजत, कांस्य और कुल पदकों की संख्या है। यह पहले होना चाहिए सोने की संख्या, फिर सिल्वर और अंत में कांस्य द्वारा क्रमबद्ध।

असल में, मेरे पास एक टेबल है Medalsजिसमें कुछ ओलंपिक खेलों में कुछ प्रतिभागियों द्वारा जीते गए पदक शामिल हैं।

पदक निम्न प्रकार से संग्रहीत किए जाते हैं: "स्वर्ण पदक", "रजत पदक", "कांस्य पदक" colorमेरी मेज का क्षेत्र Medals

मैंने निम्नलिखित प्रश्न का उपयोग करने की कोशिश की:

SELECT q1.country, q1.name as "Game", q1.cntG, q2.cntS, q3.cntB FROM
(
SELECT c.countryName as country, g.name as name, count(m.idMedal) as cntG
FROM Game g
INNER JOIN Participant p
ON p.fkGame = g.idGame
INNER JOIN Country c
ON p.fkCountry = c.idCountry
INNER JOIN Medals m
ON m.fkMedalist = p.idParticipant
WHERE
g.name = "2012 Summer Olympics"
AND m.color like "%Gold%"
GROUP BY c.countryName
ORDER BY c.countryName, cntG DESC
) as q1,
(
SELECT c.countryName as country, g.name as name, count(m.idMedal) as cntS
FROM Game g
INNER JOIN Participant p
ON p.fkGame = g.idGame
INNER JOIN Country c
ON p.fkCountry = c.idCountry
INNER JOIN Medals m
ON m.fkMedalist = p.idParticipant
WHERE g.name = "2012 Summer Olympics"
AND m.color like "%Silver%"
GROUP BY c.countryName
ORDER BY c.countryName, cntS DESC
) as q2,
(
SELECT c.countryName as country, g.name as name, count(m.idMedal) as cntB
FROM Game g
INNER JOIN Participant p
ON p.fkGame = g.idGame
INNER JOIN Country c
ON p.fkCountry = c.idCountry
INNER JOIN Medals m
ON m.fkMedalist = p.idParticipant
WHERE g.name = "2012 Summer Olympics"
AND m.color like "%Bronze%"
GROUP BY c.countryName
ORDER BY c.countryName, cntB DESC
) as q3
GROUP BY q1.country
ORDER BY q1.cntG, q2.cntS, q3.cntB DESC

खैर, यह मुझे एक पूरी तरह से अजीब परिणाम देता है। मुझे पता है कि इस क्वेरी में कुछ गड़बड़ है लेकिन यह पता नहीं लगा सकता कि यह क्या है!

क्या आपसे मुझे मदद मिल सकती है :)

धन्यवाद

नोट: मैंने इस समय कुल प्रश्नों की संख्या (जैसा कि असाइनमेंट में पूछा गया है) को नजरअंदाज कर दिया। एक बार जब मैंने पहले भाग के निर्माण के लिए सोचा था कि मैं कुल के लिए कोशिश करूँगा

उत्तर:

जवाब के लिए 3 № 1

डेटा समस्या नहीं हैं - तथ्य यह है कि आपके पास q1, q2 और q3 में से प्रत्येक के बीच एक अंतर्निहित कार्टेशियन शामिल है है एक समस्या। प्रयत्न, कोशिश:

SELECT c.countryName as country,
count(case m.idMedal when "Gold medal" then 1 end) as cntG,
count(case m.idMedal when "Silver medal" then 1 end) as cntS,
count(case m.idMedal when "Bronze medal" then 1 end) as cntB
FROM Game g
INNER JOIN Participant p ON p.fkGame = g.idGame
INNER JOIN Country c ON p.fkCountry = c.idCountry
INNER JOIN Medals m ON m.fkMedalist = p.idParticipant
WHERE g.name = "2012 Summer Olympics"
GROUP BY c.countryName
ORDER BY cntG DESC, cntS DESC, cntB DESC

जवाब के लिए 2 № 2

क्षमा करें, लेकिन आपकी क्वेरी एक वास्तविक गड़बड़ है। आप इस तरह से 3 उपश्रेणियों में शामिल नहीं हो सकते।

हालाँकि, आपके पास एक क्वेरी में क्या हो सकता है। मैं आपको छद्म कोड दूंगा और आपको विवरण छोड़ दूंगा :)

SELECT
[countryName],
SUM(color like "%Gold%") as total_gold,
SUM(color like "%Silver%") as total_silver,
SUM(color like "%Bronze%") as total_bronze,
COUNT(*) as total
FROM Medals
INNER JOIN Participant (...)
INNER JOIN Country (...)
INNER JOIN Game (...)
WHERE (...)
GROUP BY [countryName]
ORDER BY total_gold DESC, total_silver DESC, total_bronze DESC;

उत्तर № 3 के लिए 1

आपकी क्वेरी को ठीक करने या यहां तक ​​कि सुधार करने के बहुत सारे तरीके हैं, जिनमें से एक जोड़ रहा है

 ...
WHERE q1.country = q2.country
AND q1.country = q3.country

(तुरंत पहले GROUP BY q1.country)।

एक अन्य समाधान qin, q2 और q3 ON को शामिल करना होगा country


संबंधित सवाल
सबसे लोकप्रिय