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
case when
으로 년도 조건을 걸어 해당 년도일 경우 1, 아닐 경우 null이 출력되도록 한다.
case when
을 count()로 감싸 1일 경우만 카운트되도록 하여, 해당 년도의 값들만 카운트한 컬럼을 생성한다.
count(CASE WHEN year = '2014' then 1 else 0 end) as '2014'
null이 아닌 0으로 작성했더니 밑과 같이 다 동일한 값으로 카운트되었다.
THEN 0을 반환하면 COUNT()
는 NULL이 아닌 값만 세기 때문에 0도 포함되어 0도 COUNT 함수에서 개수로 세어진다.
즉, 모든 행이 0을 반환하면 위와 같이 전체 행 개수를 그대로 출력하는 문제가 발생한다.