2012-03-05 16 views
20

मैं एक प्रश्न है कि मैं वर्तमान में उपयोग कर रहा हूँ परिष्कृत करने के लिए कोशिश कर रहा हूँ ग्रुप के साथ सशर्त COUNT:MySQL - द्वारा

SELECT `puid`, 
     COUNT(DISTINCT `droid_v`) AS DROID, 
     COUNT(DISTINCT `sig_v`) AS sig, 
     SUM(NoExt) AS hits 
     FROM temp 
     GROUP BY `puid` 

और मैं केवल droid_v गिनती जहां droid_V से अधिक 0. यह है है करने के लिए इसे प्राप्त करने की आवश्यकता इस तरह की गिनती की स्थिति के लिए संभव है? फिलहाल, यह शून्य मानों को गिनती के रूप में गिन रहा है, और मैं वास्तव में शून्य को null मानों में नहीं बदल सकता।

मुझे droid_V = 0 के लिए गिनती मूल्य जानने की आवश्यकता नहीं है, तो मुझे इसकी गणना करने की आवश्यकता है यदि उसके पास 0 से अधिक संख्या है। वह संख्या हमेशा 0, 1, 2, 3, या 4 होगी।


मैं कोशिश की है:

SELECT `puid`, 
    COUNT(DISTINCT CASE WHEN `droid_v` > 0 THEN 1 END) AS DROID, 
    COUNT(DISTINCT `sig_v`) AS sig, 
    SUM(`NoExt`) AS hits 
    FROM temp 
    GROUP BY `puid` 

लेकिन यह एक द्विआधारी परिणाम देता है (या तो 0 या 1) गिनती मैं उम्मीद कर रहा हूँ नहीं।

उदाहरण उत्पादन =

puid   DROID sig  hits 
No PUID   1  1  252 
x-fmt/92  1  5  1008 

प्रत्याशित उत्पादन:

puid   DROID sig  hits 
No PUID   1  1  252 
x-fmt/92  3  5  1008 

नमूना डेटा:

id;puid;droid_v;sig_v;speed;Ext;NoExt;tally 


1;"No PUID";"3";"v13";"SLOW";"0";"63";"63" 
2;"x-fmt/92";"3";"v13";"SLOW";"63";"0";"63" 
3;"x-fmt/92";"3";"v37";"SLOW";"63";"63";"126" 
4;"x-fmt/92";"3";"v45";"SLOW";"63";"63";"126" 
5;"x-fmt/92";"3";"v49";"SLOW";"63";"63";"126" 
6;"x-fmt/92";"3";"v50";"SLOW";"63";"63";"126" 
7;"x-fmt/92";"5";"v13";"SLOW";"63";"0";"63" 
8;"No PUID";"5";"v13";"SLOW";"0";"63";"63" 
9;"x-fmt/92";"5";"v37";"SLOW";"63";"63";"126" 
10;"x-fmt/92";"5";"v45";"SLOW";"63";"63";"126" 
11;"x-fmt/92";"5";"v49";"SLOW";"63";"63";"126" 
12;"x-fmt/92";"5";"v50";"SLOW";"63";"63";"126" 
13;"No PUID";"6";"v13";"FAST";"0";"63";"63" 
14;"x-fmt/92";"6";"v13";"SLOW";"63";"0";"63" 
15;"No PUID";"6";"v13";"SLOW";"0";"63";"63" 
16;"x-fmt/92";"6";"v13";"FAST";"63";"0";"63" 
17;"x-fmt/92";"6";"v37";"SLOW";"63";"63";"126" 
18;"x-fmt/92";"6";"v37";"FAST";"63";"63";"126" 
19;"x-fmt/92";"6";"v45";"FAST";"63";"63";"126" 
20;"x-fmt/92";"6";"v45";"SLOW";"63";"63";"126" 
21;"x-fmt/92";"6";"v49";"FAST";"63";"63";"126" 
22;"x-fmt/92";"6";"v49";"SLOW";"63";"63";"126" 
23;"x-fmt/92";"6";"v50";"FAST";"63";"63";"126" 
24;"x-fmt/92";"6";"v50";"SLOW";"63";"63";"126" 
+0

क्या आप 'WHERE' क्लॉज जोड़ सकते हैं? आपके द्वारा प्रदान किए गए उदाहरण से –

+0

, आपका अपेक्षित परिणाम क्या है? –

उत्तर

26

यदि droid_v केवल 0, 1, 2, 3, या 4 हो सकता है, तो COUNT (DISTINCT) 5 से अधिक कभी वापस नहीं आएगा, क्योंकि केवल पांच संभावित मान हैं। क्या तुम यही चाहते हो? यदि हां, तो फिर इस कोशिश:

SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v ELSE 0 END) - 1 AS droid /* -1 for the case where droid_v is 0 */ 
    , COUNT(DISTINCT sig_v) AS sig 
    , SUM(NoExt) AS hits 

अद्यतन: ओह, माफ करना, ऊपर नहीं बहुत सही रूप में वहाँ एक शून्य नहीं सकता है। यह होना चाहिए:

SELECT puid, SUM(CASE WHEN droid_v > 0 THEN 1 ELSE 0 END) AS droid 
    , COUNT(DISTINCT sig_v) AS sig 
    , SUM(NoExt) AS hits 

आशा इस मदद करता है:

SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v END) AS droid 

हैं, तो दूसरी ओर, यदि आप सभी पंक्तियों जहां droid_v> 0 है, तो मुझे लगता है कि आप इस चाहते हैं की गिनती करना चाहता हूँ।

SELECT puid, 
SUM(droid_v > 0) AS DROID, 
COUNT(DISTINCT sig_v) AS sig, 
SUM(`NoExt`) AS hits 
FROM t 
GROUP BY puid 

हालांकि, यह स्पष्ट नहीं है कि आप अलग या नहीं गणना करना चाहते हैं:

+0

एक बात करता है - मैं आपके परिवर्तन से पहले इसे दूर कर रहा था, और यह पता लगाने की कोशिश कर रहा था कि क्या गलत था। आप सही हैं, यह शून्य नहीं है। आपके समय के लिए धन्यवाद। – Jay

7
SELECT 
    `puid`, 
    COUNT(DISTINCT CASE WHEN `droid_v` > 0 THEN `droid_v` END) AS DROID, 
    COUNT(DISTINCT `sig_v`) AS sig, 
    SUM(NoExt) AS hits 
+0

अरे, सुझाव के लिए धन्यवाद, मैंने आपके विचार का जवाब देने के लिए प्रश्न संपादित किया है। – Jay

+0

मेरा प्रारंभिक उत्तर आपके स्पष्ट प्रश्न के बावजूद गलत था। संशोधित उत्तर देखें। –

+0

यह अपेक्षा के अनुसार काम करता है। संशोधन के लिए धन्यवाद। – Jay

1

क्वेरी में जोड़ने

WHERE droid_v > 0 
+0

धन्यवाद - धन्यवाद कि वास्तव में काम नहीं किया। – Jay

3

यह आसान समाधान मैं के बारे में सोच सकते हैं।आप तो अलग-अलग मान की गणना करना चाहते हैं:

SELECT puid, 
COUNT(if(droid_v > 0, droid_v, null)) AS DROID, 
COUNT(DISTINCT sig_v) AS sig, 
SUM(`NoExt`) AS hits 
FROM t 
GROUP BY puid 
+0

एक नज़र रखने के लिए धन्यवाद - यह करीब है, लेकिन यह मुझे आवश्यक विशिष्ट कार्य खो देता है (क्षमा करें अगर मैंने यह स्पष्ट नहीं किया है) – Jay

5

बस इस की जाँच राशि

इसलिए यदि आप समूह कुछ करना चाहते हैं का उपयोग

select city, sum(case when gender = 'male' then 1 else 0 end) as male, 
sum(case when gender = 'female' then 1 else 0 end) as female 
from person 
group by city 

इस रूप में सरल: डी

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