반응형

출처 : https://stackoverflow.com/questions/24636412/sql-using-case-in-count-and-group-by

group by와 count에서 CASE를 사용하는 SQL

저는 테이블에서 데이터를 분류하기 위해 CASE를 사용하여 그들의 개수를 세었지만 결과가 정확하지 않습니다.

실제 데모는 여기 있습니다.

select DATE(date) as day, count(*),
count(distinct case when name = 'fruit' then 1 else 0 end) as fruits,
count(distinct case when name = 'vege' then 1 else 0 end) as vege,
count(distinct case when name = 'sweets' then 1 else 0 end) as sweets
from food
group by day
with rollup

문제가 CASE에 있는지 또는 문자열 매칭 =에 있는지 확실하지 않습니다. 'sweets'가 없는데 여전히 1로 계산됩니다. 어떤 지적 사항이든 감사합니다.


3 개의 답변 중 1개의 답변

당신의 문제는 NULL이 아닌 모든 결과도 세는데 COUNT를 사용한 것입니다. 당신은 다음처럼 사용했습니다.

COUNT(distinct case when name = 'sweets' then 1 else 0 end)

그래서 이름이 sweets가 아닐 때, 그것을 0으로 세야 합니다. 게다가 DISTINCT를 사용했기 때문에, 하나 또는 두 개의 값을 셀 것입니다. 당신은 SUM을 사용하고 DISTINCT를 삭제하고 ELSE 0을 사용해야 합니다.

SELECT  DATE(date) as day, 
        COUNT(*),
        SUM(CASE WHEN name = 'fruit' THEN 1 ELSE 0 END) as fruits,
        SUM(CASE WHEN name = 'vege' THEN 1 ELSE 0 END) as vege,
        SUM(CASE WHEN name = 'sweets' THEN 1 ELSE 0 END) as sweets
FROM food
GROUP BY DAY
WITH ROLLUP

또는

SELECT  DATE(date) as day, 
        COUNT(*),
        COUNT(CASE WHEN name = 'fruit' THEN 1 ELSE NULL END) as fruits,
        COUNT(CASE WHEN name = 'vege' THEN 1 ELSE NULL END) as vege,
        COUNT(CASE WHEN name = 'sweets' THEN 1 ELSE NULL END) as sweets
FROM food
GROUP BY DAY
WITH ROLLUP

여기는 수정된 sqlfiddle입니다.

반응형
반응형

출처 : https://stackoverflow.com/questions/14048098/count-distinct-with-conditions

조건과 함께 중복제거 개수 세기(COUNT DISTINCT with CONDITIONS)

저는 특정 조건으로 열 이름으로 고유한 항목의 수를 계산하고 싶습니다. 예를 들어 다음과 같은 테이블이 있습니다.

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

고유 태그 수를 "태그 수"로 계산하고 항목 ID가 0보다 큰 고유 태그 수를 동일한 테이블에서 "양수 태그 수"로 계산하려면 어떻게 해야 합니까?

이제 두 번째 테이블에서 entryID가 0보다 큰 행만 선택한 두 개의 다른 테이블에서 계산하고 있습니다. 이 문제를 해결할 수 있는 더 간결한 방법이 있어야 한다고 생각합니다.


5개의 답변 중 1개를 추려냄

다음을 시도할 수 있습니다.

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

첫번째 count(distinct...)는 쉽습니다. 두번째는 다소 복잡해 보이지만, case...when 구문을 사용한 것만 제외하면 첫번째 것과 똑같습니다. case...when 구문에서 양수 값만 필터링합니다. 0과 음수 값은 null로 평가되며 개수를 계산하지 않습니다.

여기서 주목해야 할 점은 테이블을 한 번만 읽으면 이 작업을 수행할 수 있다는 것입니다. 같은 표를 두 번 이상 읽어야 할 것 같지만 실제로는 대부분의 시간에 한 번에 읽을 수 있습니다. 결과적으로 더 적은 입출력으로 작업을 훨씬 빠르게 완료합니다.

반응형

+ Recent posts