2012-03-05 87 views
20

我試圖提煉,我目前使用的查詢:MySQL的 - 條件與COUNT GROUP BY

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'子句嗎?您提供的示例中的 – 2012-03-05 01:00:05

+0

,您的預期結果是什麼? – 2012-03-05 02:07:18

回答

26

如果droid_v只能是0,1,2,3或4,那麼COUNT(DISTINCT)永遠不會返回5以上,因爲只有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, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v END) AS droid 

如果,另一方面,你希望所有地方droid_v> 0,那麼我想你想這樣的行數:

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 

希望這有助於。

+0

那就是那個 - 在你改變之前,我正在撬開它,並試圖弄清楚什麼是錯的。你是對的,它不是零。謝謝你的時間。 – Jay 2012-03-05 02:30:30

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 2012-03-05 01:35:30

+0

儘管你有明確的問題,但我的初步答案是錯誤的。看修改後的答案。 – 2012-03-05 02:14:46

+0

按預期工作。感謝修改。 – Jay 2012-03-05 02:41:07

1

此添加到查詢

WHERE droid_v > 0 
+0

謝謝你看看 - 但這真的沒有奏效。 – Jay 2012-03-05 02:37:27

3

這是我能想到的最簡單的辦法:

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

但是,如果要算上不同與否,目前尚不清楚。如果要算上不同的值,則:

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 2012-03-05 02:38:54

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 

這樣簡單:d