매일 쿼리를 날리지만 오늘 CASE절을 어떻게 사용할지 확실하게 경험하게 되어 어떨때 사용할 수 있는 지 짧게 기록해보려고 한다.
먼저 CASE절의 기본 매커니즘은 다음과 같다.
CASE WHEN "조건1" THEN "출력1"
WHEN "조건2" THEN "출력2" -- (선택)
ELSE "출력3" -- (선택)
END
CASE 와 END는 CASE절을 사용하기 위해 열고 닫는 느낌으로 사용한다.
"CASE ~~~ END" 의 느낌이다.
WHEN 과 THEN, ELSE는 영어 단어를 함께 생각해 보면 쉽다. WHEN 은 -하면 즉, 조건이다(어떤조건이 주어지면), THEN은 그러면의 뜻이다. 앞에있는 WHEN절에서 조건이 주어지면 THEN(그러면 다음과 같이 출력할것이다)의 의미이고, ELSE -이외 라는 뜻으로 앞의 조건에 포함되지 않는다면 그외의 상황에는 다음과 같이 출력할 것이다.
WHEN은 하나만 쓰고 ELSE는 안써도 무방하다 즉 두번째 WHEN과 ELSE는 선택이고 조건이 많다면 WHEN을 여러개 늘려도 가능하다.
예시를 통해 활용방법을 알아보면 아래와 같다.
먼저, 예를 들기 위한 테이블을 준비해보았다.
지역 | 연령(세) | 인구수(명) |
---|---|---|
서울 서초구 | 0 | 100 |
서울 서초구 | 1 | 420 |
서울 서초구 | 2 | 560 |
- | - | - |
서울 서초구 | 100 | 2 |
서울 종로구 | 0 | 90 |
서울 종로구 | 1 | 600 |
- | - | - |
서울 관악구 | 100 | 1 |
( -는 생략 표시)
위와같이 서울시의 모든 시군구 별로 0세부터 100세까지 인구수를 표현하고 있는 데이터가 있다고 가정하자.(테이블명 : population_age)
어느날 국가에서 각 시군구별로 65세이상의 고령자분들의 인구비율을 알고 싶다고 했을 때 어떻게 출력해야할까..
SQL을 입문한 사람들이라면 잠시 생각해봤을때 방법이 떠오르지 않을것이다.
이때 사용할 수 있는 방법중 하나가 CASE절을 활용하는 것이다.
우선 정답 쿼리는 아래와 같다.
SELECT T1.지역,(T1.고령인구 / T1.총인구수) AS 고령비율 --1
FROM( --2
SELECT 지역, --3
SUM( --4
CASE WHEN 연령(세) >=65 THEN 인구수(명) --5
END --6
) AS 고령인구, --7
SUM(인구수(명)) AS 총인구수 --8
--9
FROM population_age --10
GROUP BY 지역 --11
) AS T1 --12
더좋은 방법이 있으면 공유부탁드립니다~