[solvesql] 3년간 들어온 소장품 집계하기

yenpkr·2025년 3월 25일
0

sql

목록 보기
68/91

문제

제출

WITH a as (
  SELECT *,strftime('%Y',acquisition_date) year
  FROM artworks
)
SELECT classification
,count(CASE WHEN year = '2014' then 1 else null end) as '2014'
,count(CASE WHEN year = '2015' then 1 else null end) as '2015'
,count(CASE WHEN year = '2016' then 1 else null end) as '2016'
FROM a
GROUP BY classification
ORDER BY 1 asc

📌 새로 배운 내용

✅ count(case when )

case when 으로 년도 조건을 걸어 해당 년도일 경우 1, 아닐 경우 null이 출력되도록 한다.
case when 을 count()로 감싸 1일 경우만 카운트되도록 하여, 해당 년도의 값들만 카운트한 컬럼을 생성한다.

🚨 error

count(CASE WHEN year = '2014' then 1 else 0 end) as '2014'

null이 아닌 0으로 작성했더니 밑과 같이 다 동일한 값으로 카운트되었다.

THEN 0을 반환하면 COUNT() 는 NULL이 아닌 값만 세기 때문에 0도 포함되어 0도 COUNT 함수에서 개수로 세어진다.
즉, 모든 행이 0을 반환하면 위와 같이 전체 행 개수를 그대로 출력하는 문제가 발생한다.

0개의 댓글