MySQL - 带GROUP BY的条件COUNT

Jay*_*Jay 27 mysql sql

我正在尝试优化我目前使用的查询:

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

我需要得到它只能算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`
Run Code Online (Sandbox Code Playgroud)

但是这给出了二进制结果(0或1)而不是我期望的计数.

示例输出=

puid            DROID   sig     hits
No PUID         1       1        252
x-fmt/92        1       5       1008
Run Code Online (Sandbox Code Playgroud)

预期产量:

puid            DROID   sig     hits
No PUID         1       1        252
x-fmt/92        3       5       1008
Run Code Online (Sandbox Code Playgroud)

样本数据:

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"
Run Code Online (Sandbox Code Playgroud)

Dav*_*ber 37

如果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
Run Code Online (Sandbox Code Playgroud)

更新:哎呀,对不起,上面是不是因为有可能不完全正确零.它应该是:

SELECT puid, COUNT(DISTINCT CASE WHEN droid_v > 0 THEN droid_v END) AS droid
Run Code Online (Sandbox Code Playgroud)

另一方面,如果你想要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
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.


Joh*_*ick 8

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
Run Code Online (Sandbox Code Playgroud)


小智 8

只需使用一笔钱

所以,如果你想分组,请检查一下

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
Run Code Online (Sandbox Code Playgroud)

这很简单:D

  • 这是更好的答案。另外,您可以使用 MYSQL IF 而不是 CASE。例如,`SUM( IF( 性别 = '男' , 1, 0 ) )` (2认同)