MySQL - 조건부 카운트(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보다 큽니다.이런 식으로 카운트를 조절하는 것이 가능합니까?현재 0의 값을 셀 수 있는 값으로 계산하고 있으며, 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"
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
도움이 되길 바랍니다.
그냥 합계를 사용합니다.
그래서 만약 당신이 무언가를 그룹화하고 싶다면 이것을 확인해보세요.
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
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
이것이 제가 생각할 수 있는 가장 간단한 해결책입니다.
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
쿼리에 추가
WHERE droid_v > 0
언급URL : https://stackoverflow.com/questions/9560432/mysql-conditional-count-with-group-by
'programing' 카테고리의 다른 글
워드프레스의 'gmt_offset' 옵션에서 GMT Offset 가져오기 (0) | 2023.09.23 |
---|---|
POSIX 실시간 신호를 사용하는 사람과 그 이유는? (0) | 2023.09.23 |
스위프트의 역범위 (0) | 2023.09.23 |
Npm install에서 경고가 표시되고 npm 감사 수정이 작동하지 않음 (0) | 2023.09.23 |
$location으로 AngularJS url 변경 (0) | 2023.09.23 |