2012-05-01 18 views
7

मेरे पास रिपोर्ट की एक तालिका है जिसमें फ़ील्ड Case (अद्वितीय संख्या), ISR (व्यक्तिगत सुरक्षा रिपोर्ट - अद्वितीय संख्या) और YearsOld शामिल हैं।चयन मामले में DISTINCT COUNT SQL

प्रत्येक मामले के लिए एक से अधिक आईएसआर हो सकते हैं। मैं उम्र समूहों के भीतर अद्वितीय मामलों की संख्या गिनना चाहता हूं।

SELECT 
COUNT(CASE WHEN `YearsOld` = -2) THEN 1 END) `No Report`, 
COUNT(CASE WHEN `YearsOld` BETWEEN 0 AND 5) THEN 1 END) `0 to 5` 
COUNT(CASE WHEN `YearsOld` BETWEEN 6 AND 12) THEN 1 END) `6 to 12` 
FROM `Demographics` 

इस संशोधित करने के लिए इन आयु समूह DISTINCT Cases गिनती करने के लिए एक तरीका है:

यह एसक्यूएल मुझे ISRs की संख्या की गिनती देता है?

+0

हमेशा एक संभावना है, लेकिन क्या हुआ अगर एक मामला 5-6 साल से एक व्यक्ति को फैलाता है। क्या आप चाहते हैं कि गिनती उस सीमा में हो, जो मामला शुरू हुआ, या जिस मामले में व्यक्ति हाल ही की गतिविधि के माध्यम से जुड़ा हुआ है। – DRapp

+0

क्या 'केस' के पास अलग-अलग 'आईएसआर' के लिए अलग-अलग 'वर्ष पुरानी' आयु हो सकती है? – eggyal

+0

हां। एक आईएसआर एक प्रतिकूल दवा प्रतिक्रिया पर एक व्यक्तिगत सुरक्षा रिपोर्ट है। एक विशिष्ट घटना (दो या दो से अधिक संवाददाताओं द्वारा प्रस्तुत) पर एक से अधिक आईएसआर हो सकते हैं, और अलग-अलग तिथियों पर उनके साथ होने वाले प्रतिकूल घटनाओं के लिए एक ही मामले में एक से अधिक आईएसआर हो सकते हैं। आदर्श रूप से, केस + डेटऑफवेन्ट + साल का उपयोग किसी दिए गए आयु में किसी मामले में होने वाली प्रतिकूल घटनाओं की सटीक संख्या को गिनने के लिए किया जाएगा, लेकिन ईवेंट की तिथि अक्सर रिपोर्ट से छोड़ी जाती है, इसलिए केस + साल पुराना जितना करीब हो सकता है अद्वितीय केस + प्रतिकूल इवेंट्स की गिनती करने के लिए। आपका समाधान नीचे काम करता है। –

उत्तर

8

अपने "मामले" चर अद्वितीय है, तो आप निश्चित रूप से अलग कीवर्ड सीधे एसक्यूएल मामला वाक्य रचना में डाल कर सकते हैं:

Count(distinct CASE when yearsold between 6 and 12 then case else null end) 

इस तरह से, मामले चर के प्रत्येक अनन्य मान केवल एक बार गिना जाता है।

कॉलम नामकरण पर बस एक नोट, मैं सुझाव दूंगा कि SQL में अर्थ है जिसका अर्थ है यदि आपके पास कोई विकल्प है (यानी मामले के बजाय 'case_num' का उपयोग करें)।

+0

धन्यवाद, मैं आपके नोट पर सहमत हूं; 'केस' मौजूदा तालिका में फ़ील्डनाम है। –

4

आप मामले प्रति एक भी YearsOld क्षेत्र के लिए अपने जनसांख्यिकी तालिका फिल्टर करने के लिए है, हालांकि यदि यह मामला हो सकता है अलग ISR के लिए अंतर उम्र यह केवल अंत एक दायरे में गिने जाते हैं जो देंगे से संबंधित कर दिया गया है एक सबक्वेरी इस्तेमाल कर सकते हैं (शायद इस तुम क्या चाहते है):

SELECT 
    ... -- as you currently have 
FROM (
    SELECT `Case`, `YearsOld` from `Demographics` GROUP BY `Case` 
) t; 
वैकल्पिक रूप से

, करने के लिए "गिनती" प्रत्येक ब्रैकेट में मौजूद "अलग" "मामले", आप सचमुच ऐसा:

SELECT 
    COUNT(DISTINCT CASE WHEN `YearsOld` = -2 THEN 1 END) `No Report`, 
    COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 0 AND 5 THEN `Case` END) `0 to 5`, 
    COUNT(DISTINCT CASE WHEN `YearsOld` BETWEEN 6 AND 12 THEN `Case` END) `6 to 12` 
FROM Demographics; 
+0

धन्यवाद, यह काम करता है। मैं डिस्टिंट 'केस' + 'साल पुराना' गिनना चाहता हूं जो यह पूरी तरह से करता है। –

संबंधित मुद्दे