SQL/LeetCode(리트코드)

MySQL CASE WHEN문 사용법 유의점 예제 핵심 정리

진리뷰 2024. 11. 14. 09:00
반응형

 

 

MySQL-CASE-WHEN문-사용법-유의점-예제-핵심-정리-썸네일
MySQL CASE WHEN문 핵심 정리

 

 

이 글은 MySQL CASE WHEN문 사용법, 유의점 등의 핵심을 담고 있습니다. 또한, 예제와 설명 및 관련 추천글이 포함되어 있어

쉽게 이해할 수 있도록 작성했습니다.

 

 

 

MySQL CASE WHEN문 사용법, 유의점

 

CASE WHEN 은 말 그대로 '~조건에 해당한다면 ~해, 아니라면 -해'라고 지시하는 조건문법이다.

가장 기본 문법은 아래와 같고, AND와 OR을 사용해서 하나의 CASE WHEN문 안에서 여러 조건을 설정할 수 있다.

 

AND와 OR을 사용한 CASE WHEN문법은 추천글을 통해 확인할 수 있습니다.

*추천글: MySQL 조건문 CASE WHEN, 조건 여러 개(AND, OR)

 

MySQL 조건문 CASE WHEN, 조건 여러 개(AND, OR)

이 글은 MySQL의 조건문 CASE WHEN 사용 방법, 조건 여러 개 거는 방법 설명과 예시를 담았습니다. MySQL CASE WHEN 조건문 CASE WHEN은 조건을 설정하고 해당 조건을 충족, 미충족 한 것들의 결괏값을 보여

like-or-like.tistory.com

 

SELECT
 CASE
   # 조건1에 해당하면 결과값1을 반환해라
   WHEN 조건1 THEN 결과값1
   # 조건 2에 해당하면 결과값2를 반환해라
   WHEN 조건2 THEN 결과값2
   # 모든 조건에 해당하지 않으면 결과값3을 반환해라
   ELSE 결과값3
   # 조건문 끝
   END
 AS 컬럼명
FROM 테이블명

 

 

이 문법의 유의할 점은 '논리의 충돌'을 고려해서 작성해야 한다.

무슨 말이냐 하면, YES or NO 판단 하에 CASE WHEN문이 작동한다. 따라서 경우의 수를 고려해야 하고, 결괏값이 중복되지 않도록 미시적인 조건을 조건 1로 작성해야 한다. 포괄적인 결괏값을 갖는 조건은 ELSE에 작성하는 것이 좋다.

 

Yes-Or-No-Flow-Chart
Yes Or No Flow Chart

 

예를 들어, '키 150 이상이면 150으로 반환해, 키 160 이상이면 160으로 반환해, 키 170 이상이면 170으로 반환해'라는 조건을 CASE WHEN으로 작성한다고 가정하자.

 

이때 '키 150 이상이면 150으로 반환해'라는 조건을 WHEN 1에 작성하면, 키 160과 170까지 포함해서 가장 포괄적인 값을 갖는 조건이다. 따라서 160과 170으로 반환해야 할 값들이 첫 번째 조건에 이미 다 포함되기에, 이후 WHEN 2와 ELSE와 충돌한다.

 

따라서 CASE WHEN '170 이상이면 170으로 반환해' -> WHEN '160 이상이면 160으로 반환해' -> ELSE '모든 조건에 해당하지 않는 값은 150으로 반환해'로 작성해야 한다.

 

*이와 관련한 설명과 예제는 본문 마지막에 추가했으니, 확인해 보세요!

 

 

 

MySQL CASE WHEN 예제 핵심 정리

 

LeetCode의 Monthly Transactions 1 문제로, transaction state가 approved인 데이터를 필터링하는 문제이다.

 

솔직히 오랜만에 SQL 문제 풀어서 문법이 잘 기억 안나는 상황이다;;

하지만 급히 다시 감각을 살려야 해서 일단 기억나는 문법으로 풀며 감각을 되살려보려고 한다.

*만약 IF문을 사용했다면, 코드 가독성이 더 좋았겠다.

 

MySQL-CASEWHEN-예제-LeetCode-Monthly-Transactions-1
LEET CODE Monthly Transactions 1

 

 

아래는 해당 문제의 정답 코드로, 설명은 아래와 같다.

  • SELECT
    • month: trans_date를 연도와 월만 표시해야 하므로, DATE_FORMAT() 사용
    • trans_count: transactions 총횟수를 표시해야 하므로, state 칼럼에 NULL 아닌 어떤 값이 입력되어 있으면 1로 치환 후 누적된 1을 모두 더한다는 의미로, CASE WHEN()과 IS NOT NULL 및 SUM() 사용
    • approved_count: approved 상태의 총횟수를 표시해야 하므로, CASE WHEN()과 SUM() 사용. 이때 NULL값은 0으로 반환하는 것이 문제의 조건이기에, IFNULL() 사용.
    • trans_total_amount: 거래 상태와 무관하게 총금액을 표시해야 하므로, SUM() 사용
    • approved_total_amount: approved 상태의 총금액을 표시해야 하므로, CASE WHEN() 사용 후 해당 조건에 맞는 값을 모두 더하고자 SUM()으로 감싼다. 이때 NULL값은 0으로 반환하는 것이 문제의 조건이기에 IFNULL()로 전체를 감싼다.
  • GROUP BY
    • Output을 보면, 기간별 국가의 transactions 정보를 반환하는 것이기에 month와 country를 그룹화한다.

*추천글: MySQL 집계 함수, GROUP BY와 HAVING 사용 방법

SELECT
 DATE_FORMAT(trans_date, '%Y-%m') AS month,
 country,
 SUM(CASE WHEN state IS NOT NULL THEN 1 END) AS trans_count,
 IFNULL(SUM(CASE WHEN state = 'approved' THEN 1 END), 0) AS approved_count,
 SUM(amount) AS trans_total_amount,
 IFNULL(SUM(CASE WHEN state 'approved' THEN amount), 0) AS approved_total_amount
FROM transactions
GROUP BY month, country

 

 

 

MySQL CASE WHEN 정리

 

  • 조건문으로, 조건에 해당하는 값을 반환 시 사용.
  • YES or No 논리 구조로 작동하기에, 경우의 수를 고려해야 한다.
  • 하나의 WHEN절에서 다중 조건을 설정하고 싶다면 AND, OR을 사용할 수 있다.
  • CASE WHEN문은 길어서 END 뒤에 AS로 컬럼명을 지정한다.

 

마지막으로, 이번 글의 예제는 Yes or No 논리 구조를 고려하지 않아도 풀 수 있는 문제다.

하지만 이에 대해 더 알고 싶다면, 아래 추천글을 통해 논리 구조를 고려한 CASE WHEN 예제 글을 추천드리며 마무리한다.

*추천글: HackerRank(해커랭크) MySQL Type of Triangle 문제 답

 

HackerRank(해커랭크) MySQL Type of Triangle 문제 답

*MySQL 버전, advanced select 문제입니다. 해커랭크 Type of Triangle 문제, 샘플, 설명 TRIANGLES 테이블 레코드의 삼각형 타입을 구분하는 쿼리 작성하기. 세 변의 길이를 담은 테이블 TRIANGELS. Equilateral: 정삼

like-or-like.tistory.com

 

반응형
top