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
.
Мне не нужно знать значение count для 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), а не счет, который я ожидаю.
Пример output =
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"
Ответы
Ответ 1
Если 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
Надеюсь, что это поможет.
Ответ 2
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
Ответ 3
Просто используйте сумму
поэтому, если вы хотите сгруппировать что-нибудь, проверьте это
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
Это самое простое решение, о котором я могу думать:
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
Ответ 5
добавить это в запрос
WHERE droid_v > 0