programing

MySQL - 조건부 카운트(GROUP BY)

muds 2023. 9. 23. 23:09
반응형

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_V0보다 큽니다.이런 식으로 카운트를 조절하는 것이 가능합니까?현재 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

반응형