CASE 조건문 사용법은 알겠는데, GROUP BY, IF 함께 쓰면 헷갈려
어떤 문제를 만났을 때, 나는 이 생각을 한다. 문제를 어떤 절을 사용해야 해결할 수 있겠는가 이다. SQL이 어려울 때는 여러 가지 다양한 절을 함께 쓸 때이다. 특히 CASE 조건문 사용법을 익히고 나서 GROUP BY, IF 조건문을 함께 써야 할 때저절로 멍이 때려졌다.
CASE 조건문은 또 왜 필요해?

뒤돌아 생각해 보면, 데이터 속에서 어떤 조건에 해당하는 데이터만 뽑아오는 것은 WHERE이나 HAVING으로 할 수 있었다.
그런데 왜 도대체 또 복잡하고 CASE 조건문이 필요한 걸까? 잘 생각해 보면 위의 것은 기존 데이터에 손을 대고, 변형하거나 그렇지 않았다.
그렇다면 보고 있는 데이터에 무엇인가를 더해야 할 때, 즉 가공을 해야 할 때는 어떻게 하지? CASE 조건문을 활용하면 된다
예를 들어 기존 데이터 맨 끝에 컬럼을 하나 더 붙여서, 그 데이터 행이 어떤 결과에 속하는 지 뭐 이런 것을 넣는 것이다. 예를 들어 시험 성적이 80점 이상이면 ‘합격’을 아니면 ‘불합격’을 출력하라. 이해가 되는가?
CASE 조건문 사용법

SELECT *
, CASE
WHEN 시험결과 >= 90 THEN ‘최우수’
WHEN 시험결과 >= 80 THEN ‘우수’
ELSE ‘평균’
END AS 평가등급
FROM exam
CASE는 WHEN, THEN, ELSE(생략 가능), END과 일반적으로 함께 쓰인다. 위의 형태를 눈에 익혀 놓으면 좋을 것 같다.
내 말로 설명을 해 보겠다. 시험결과 컬럼 데이터 값이 90 이상 이면 최우수, 80 이상 이면 우수, 그 나머지는 평균으로 나타나줘, 어디에 ‘평가등급 ‘이라는 새로운 컬럼에 말이야.
CASE 조건문 사용법에서 중요하게 이해할 것이 있다. 바로 WHEN 시험결과 >= 80 THEN ‘우수’ 이 부분이다. 사람들이 80 이상이라고 하니깐 80~100 있는 것을 다 출력해야 하는 것 아닌가 생각한다.
하지만, 실제로 그 위 줄에 90 이상 부분이 있기 때문에 두번째 WHEN에서는 90 이상 부분은 생각할 필요가 없다. 80~89만 생각하면 된다. 위의 조건은 먼저 제외(필터)된다고 생각하면 된다.
CASE WHEN을 여러 개 만들어 아주 세밀하게 데이터를 분류할 수도 있고, 단 1개와 그 나머지도 출력할 수 있다.
CASE WHEN에 대해서 더 공부해 보고 싶은 사람들은 W3schools 웹사이트에서 더 알아볼 수 있다.
CASE 조건문만 해도 벅찬데, GROUP BY도 함께 쓴다고?
슬슬 SQL 절에 막막함을 느끼고 있을 때, 또 하나가 찾아왔다 GROUP BY! 그냥 CASE 조건문이 새로운 컬럼을 만들고, 거기에 지정한 분류 결과값을 넣을 수 있었다. GROUP BY를 함께 쓰는 이유는 그 새 컬럼을 기준으로 분류(그룹화)를 시도하기 위해서이다.
CASE 조건문을 이용해서 가공한 새 컬럼 기준으로 그룹화를 하고 싶으면 GROUP BY를 사용하는 것을 기억하면 된다.
SELECT CASE
WHEN 시험결과 >= 90 THEN ‘합격’
ELSE ‘불합격’
END AS 평가등급
, Count(*) AS numbers
FROM exam
GROUP BY 평가등급
위의 쿼리를 보면, CASE WHEN 조건문에서 생기는 컬럼을 평가등급이라고 했고, 그 아래에서 GROUP BY로 평가등급 기준으로 그룹화한다. 그럼 합격과 불합격 그룹의 몇 명인지(COUNT) 확인하는 쿼리가 된다.
IF 조건문 사용법
IF 조건문은 어떻게 사용할까? CASE 조건문 사용법과 달리 조금 간단해 보인다. SELECT 절과 일단 함께 쓰면 된다.
IF(price >= 500, ‘비싸다’, ‘싸다’) AS affordability 이 조건문을 보면, 가격이 500이상이면 비싸다, 그게 아니면 싸다 이런 식으로 분류를 할 수 있고 새 컬럼 이름을 AS affordability으로 붙일 수 있다.
IF 역시 GROUP BY와 함께 쓰일 수 있으며, 새로 만든 컬럼을 그룹화 기준의 컬럼으로 사용할 수 있다.
그럼 어떤 경우에 CASE와 IF 같이 쓸까?
나도 이 생각을 해 본적이 있다. 데이터를 가공할 목적으로 조건을 한다면 CASE만 쓰면 될텐데 하고 말이야. 그런데 만약 이미 CASE 조건문으로 결과값을 얻은 다음 다른 조건을 해야 할 때는 어떻게 할까? 맞다 이 때는 같이 쓰는 것 같다.
위치는 SELECT 절에 CASE ~ END와 함께 IF 조건문을 함께 쓸 수 있다. 둘 다 AS 새 컬럼 이름을 붙이고 말이야. 출력을 해 보면 원본 데이터에서 2개의 컬럼이 더 생긴 것을 볼 수 있을 것이다. 각각의 조건 값을 가지고 말이야
마무리
오늘은 CASE 조건문 사용법과 동시에 IF 조건문도 함께 알아보았다. 사실 데이터리안 데이터 분석 입문반을 듣고 있는데, 연습 문제를 풀 때 나는 내가 어떤 절을 사용해야 하는 지 미리 알고 있다. 왜냐하면 바로 전에 그 절에 대해서 배웠기 때문이다.
그런데, 그냥 문제가 갑자기 랜덤으로 나왔다. 이건 내 경험인데 갑자기 머리가 띵하니 무엇을 먼저 해야 할 지 잘 몰랐다. 문제를 많이 읽을 때는 어떤 절을 써야 할지 생각이 안 났고, 어떤 절을 쓸 지 나왔을 때는 문제의 숨겨진 의도를 파악하지 못해 틀리곤 했다.
그래서 이 포스팅에서는 CASE 조건문 사용법을 이번에 얘기했지만, 나는 어떤 상황에서 어떤 절을 사용하는 것이 좋은 지를 아는 것이 더 중요해서 이것저것 함께 쓰는 상황에 대해서 더 말해 보았다.
[함께 읽으면 좋은 글들]
