2012-03-05 110 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