MySQL - условный счет с GROUP BY - PullRequest
26 голосов
/ 05 марта 2012

Я пытаюсь уточнить запрос, который сейчас использую:

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"

Ответы [ 5 ]

34 голосов
/ 05 марта 2012

Если 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, 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

Надеюсьэто помогает.

8 голосов
/ 05 марта 2012
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
7 голосов
/ 17 марта 2013

Просто используйте сумму

так что, если вы хотите что-то сгруппировать, проверьте это

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

4 голосов
/ 05 марта 2012

Это самое простое решение, которое я могу придумать:

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
2 голосов
/ 05 марта 2012

добавить это к запросу

WHERE droid_v > 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...