SQL에서 CASE WHEN을 활용한 조건별 데이터 출력

제공

안녕하세요, 여러분! 데이터베이스 다루다 보면 복잡한 조건에 따라 다른 결과값을 출력해야 하는 경우가 정말 많죠? 저도 그랬어요! 그럴 때마다 머리 싸매고 고민했던 기억이 새록새록 떠오르네요. 그 고민, SQL의 강력한 기능 중 하나인 CASE WHEN 구문을 사용하면 깔끔하게 해결할 수 있다는 사실! 알고 계셨나요? CASE WHEN은 마치 마법처럼, 조건에 따라 다양한 결과를 나타내도록 도와주는 구문이에요. 이번 포스팅에서는 SQL에서 CASE WHEN을 활용한 조건별 데이터 출력 방법을 자세히 알아볼 거예요. CASE WHEN 기본 구문과 작동 방식부터 CASE WHEN을 사용한 데이터 분류 및 그룹화, 그리고 다른 SQL 함수와의 조합까지! 다양한 활용 예시를 통해 여러분의 데이터 분석 능력을 한 단계 업그레이드해보자구요! 함께 CASE WHEN의 세계로 떠나볼까요?

 

 

CASE WHEN 기본 구문과 작동 방식

자, 이제 SQL의 강력한 기능 중 하나인 CASE WHEN 구문에 대해 자세히 알아보도록 할까요? 마치 마법 지팡이처럼, 조건에 따라 다른 결과를 뽑아낼 수 있는 유용한 기능이랍니다! 데이터를 원하는 대로 휙휙~ 변형시켜 보는 재미를 느껴보세요!

CASE WHEN 구문은 기본적으로 “만약 ~이면 ~를 출력하고, 아니면 ~를 출력한다”는 논리를 SQL 쿼리에 적용하는 역할을 해요. 마치 프로그래밍 언어에서 사용하는 if-else 문과 비슷하다고 생각하면 이해하기 쉬울 거예요. 하지만 CASE WHEN은 SQL 쿼리 내에서 직접 조건부 로직을 처리할 수 있다는 점에서 더욱 강력한 힘을 발휘한답니다.

기본 구문

기본적인 구문은 다음과 같아요. 잘 살펴보세요!

CASE
    WHEN condition1 THEN result1
    WHEN condition2 THEN result2
    ...
    ELSE resultN  -- 선택적: 조건이 모두 만족하지 않을 경우의 결과
END

어때요? 생각보다 간단하죠? 각 부분을 하나씩 뜯어보면,

  • CASE: CASE WHEN 구문의 시작을 알리는 키워드예요.
  • WHEN condition1 THEN result1: 특정 조건(condition1)이 참(TRUE)일 경우 반환될 결과(result1)를 지정해요. 예를 들어, “만약 점수가 90점 이상이면 ‘A’”와 같은 조건을 표현할 수 있답니다.
  • ELSE resultN: 어떤 WHEN 조건에도 맞지 않는 경우 반환될 기본 결과(resultN)를 지정하는 부분이에요. 모든 경우를 커버하고 싶다면 꼭 필요한 부분이겠죠? ELSE는 선택적으로 사용할 수 있어요. 만약 ELSE가 없고 모든 WHEN 조건이 거짓이라면, NULL 값이 반환된다는 점! 잊지 마세요!
  • END: CASE WHEN 구문의 끝을 알리는 키워드예요.

실제 데이터 예시

자, 이제 실제 데이터를 가지고 예시를 들어볼게요. 회원 테이블에서 회원 등급을 구분하는 쿼리를 작성해 보겠습니다.

SELECT
    member_id,
    member_name,
    CASE
        WHEN point >= 10000 THEN 'VIP'
        WHEN point >= 5000 THEN '골드'
        WHEN point >= 1000 THEN '실버'
        ELSE '브론즈'  -- 1000점 미만은 브론즈 등급!
    END AS member_grade
FROM member_table;

이 쿼리는 point 열의 값에 따라 회원 등급을 계산해 member_grade라는 새로운 열로 출력해 줍니다. 10,000점 이상은 ‘VIP’, 5,000점 이상은 ‘골드’, 1,000점 이상은 ‘실버’, 그리고 그 미만은 ‘브론즈’ 등급으로 분류되는 것을 볼 수 있죠?

다양한 연산자와의 사용

CASE WHEN 구문은 단순 비교 연산자(>, <, =, >=, <=, !=)뿐만 아니라, LIKE, BETWEEN, IN, IS NULL과 같은 다양한 연산자와 함께 사용할 수 있어 더욱 유연하게 조건을 설정할 수 있답니다.

활용 범위

또한, CASE WHEN 구문은 SELECT, WHERE, HAVING, ORDER BY 절 등 다양한 SQL 절에서 활용될 수 있어요. 정말 만능 재주꾼이 따로 없죠?! 다음에는 CASE WHEN 구문을 활용한 다양한 조건 처리 예시를 살펴보도록 할게요. 기대해 주세요!

 

다양한 조건 처리를 위한 CASE WHEN 활용 예시

CASE WHEN 구문은 단순한 IF-ELSE 구조를 넘어, 정말 다채로운 조건 처리를 가능하게 해준답니다! 마치 요리 레시피처럼 재료(조건)와 조리법(WHEN)을 조합해서 원하는 맛(결과)을 낼 수 있는 마법 같아요! 자, 그럼 CASE WHEN 활용의 신세계를 함께 탐험해 볼까요~?

1. 복잡한 조건 조합하기

CASE WHEN의 진정한 매력은 여러 조건을 AND, OR 연산자로 엮어서 복잡한 조건식을 만들 수 있다는 점이에요. 예를 들어, 온라인 쇼핑몰에서 특정 기간 동안 VIP 고객에게만 할인 쿠폰을 지급한다고 생각해 보세요. 이때, 고객 등급이 VIP이고, 구매 금액이 10만 원 이상이며, 구매 날짜가 특정 기간 내에 있는 경우에만 쿠폰을 지급하는 복잡한 조건을 CASE WHEN 하나로 깔끔하게 처리할 수 있답니다! 마치 여러 재료를 넣고 맛있는 찌개를 끓이는 것과 같아요!

SELECT 주문번호, CASE WHEN 고객등급 = 'VIP' AND 구매금액 >= 100000 AND 구매일자 BETWEEN '2024-01-01' AND '2024-01-31' THEN '쿠폰 지급' ELSE '쿠폰 미지급' END AS 쿠폰지급여부 FROM 주문내역;

2. 범위 조건 설정하기

CASE WHEN은 숫자나 날짜 범위를 활용한 조건 처리에도 탁월해요. 학생들의 성적을 등급으로 나누는 경우를 생각해 보세요. 90점 이상은 A, 80점 이상은 B, 이런 식으로 범위를 지정해서 등급을 부여할 수 있답니다. 마치 마법의 지팡이처럼 숫자 범위를 뿅! 하고 등급으로 바꿔주는 거죠!

SELECT 학생명, 점수, CASE WHEN 점수 >= 90 THEN 'A' WHEN 점수 >= 80 THEN 'B' WHEN 점수 >= 70 THEN 'C' ELSE 'D' -- 나머지 점수는 모두 D 등급! END AS 등급 FROM 성적표;

3. NULL 값 처리하기

데이터베이스에서 NULL 값은 골칫거리일 때가 많죠? 하지만 CASE WHEN을 사용하면 NULL 값도 효과적으로 처리할 수 있어요! 예를 들어, 고객 정보 테이블에서 이메일 주소가 NULL인 경우 ‘미등록’으로 표시하고 싶다면? CASE WHEN이 짠! 하고 나타나서 해결해 줄 거예요!

SELECT 고객명, CASE WHEN 이메일 IS NULL THEN '미등록' ELSE 이메일 END AS 이메일주소 FROM 고객정보;

4. 중첩 CASE WHEN 구문 활용

CASE WHEN 구문은 중첩해서 사용할 수도 있어요! 마치 러시아 인형처럼 CASE WHEN 안에 또 다른 CASE WHEN을 넣어서 더욱 복잡한 조건 분기를 만들 수 있죠! 예를 들어, 상품 카테고리와 재고량을 기반으로 상품의 상태를 분류한다고 생각해 보세요. 의류 카테고리에 속하고 재고량이 10개 미만이면 ‘품절 임박’, 그 외의 카테고리에 속하고 재고량이 5개 미만이면 ‘재고 부족’과 같이 다양한 조건을 조합할 수 있답니다!

SELECT 상품명, 카테고리, 재고량, CASE WHEN 카테고리 = '의류' THEN CASE WHEN 재고량 < 10 THEN '품절 임박' ELSE '판매 중' END ELSE CASE WHEN 재고량 < 5 THEN '재고 부족' ELSE '판매 중' END END AS 상품상태 FROM 상품정보;

5. 다중 컬럼 기반 조건 처리

CASE WHEN은 여러 컬럼의 값을 조합해서 조건을 설정할 수도 있어요. 예를 들어, 직원 테이블에서 직급과 근무 연수를 함께 고려하여 보너스 지급 여부를 결정할 수 있겠죠? 마치 두 개의 돋보기를 사용해서 더욱 자세히 관찰하는 것과 같아요! 대리 이상 직급이고 근무 연수가 3년 이상인 직원에게만 보너스를 지급하는 쿼리를 작성해 볼게요.

SELECT 직원명, 직급, 근무연수, CASE WHEN 직급 IN ('대리', '과장', '부장') AND 근무연수 >= 3 THEN '보너스 지급' ELSE '보너스 미지급' END AS 보너스지급여부 FROM 직원정보;

CASE WHEN은 이처럼 다양한 상황에서 조건에 따라 다른 결과를 출력해야 할 때 매우 유용하게 활용될 수 있어요. 마치 만능 칼처럼 다양한 재료(데이터)를 원하는 모양(결과)으로 손질할 수 있게 해주는 강력한 도구랍니다! 다음에는 CASE WHEN과 다른 SQL 함수들을 조합해서 더욱 놀라운 결과를 만들어내는 방법을 알아볼 거예요. 기대해 주세요~! 😉

 

CASE WHEN을 사용한 데이터 분류 및 그룹화

CASE WHEN 구문은 단순 조건 처리를 넘어 데이터를 분류하고 그룹화하는 강력한 도구로 활용될 수 있어요! 데이터를 특정 기준에 따라 분류하고, 각 그룹에 대한 집계 함수를 적용하여 분석에 필요한 통찰력을 얻을 수 있답니다. 자, 이제 CASE WHEN을 사용한 데이터 분류 및 그룹화의 세계로 함께 떠나볼까요?

쇼핑몰 데이터베이스 예시

쇼핑몰 데이터베이스를 예로 들어볼게요. 고객의 구매 금액을 기준으로 ‘VIP’, ‘일반’, ‘잠재’ 고객으로 분류하고 싶다고 가정해 봅시다. CASE WHEN 구문을 사용하면 이 작업을 아주 쉽게 처리할 수 있어요! 다음 쿼리를 살펴보세요.

SELECT
    고객ID,
    고객명,
    총구매금액,
    CASE
        WHEN 총구매금액 >= 1000000 THEN 'VIP'
        WHEN 총구매금액 >= 500000 THEN '일반'
        ELSE '잠재'
    END AS 고객등급
FROM 고객정보;

이 쿼리는 총구매금액 열을 기준으로 고객을 세 가지 등급으로 분류해요. 총구매금액이 1,000,000 이상이면 ‘VIP’, 500,000 이상 1,000,000 미만이면 ‘일반’, 그 미만이면 ‘잠재’로 분류하는 거죠! 이렇게 분류된 고객 등급은 고객등급이라는 새로운 열에 저장되어 각 고객의 정보와 함께 표시된답니다.

고객 등급별 평균 구매 금액 계산

더 나아가, 각 고객 등급별 평균 구매 금액을 계산하려면 어떻게 해야 할까요? GROUP BY 절과 함께 CASE WHEN 구문을 사용하면 됩니다! 아래 쿼리를 확인해 보세요.

SELECT
    CASE
        WHEN 총구매금액 >= 1000000 THEN 'VIP'
        WHEN 총구매금액 >= 500000 THEN '일반'
        ELSE '잠재'
    END AS 고객등급,
    AVG(총구매금액) AS 평균구매금액,
    COUNT(*) AS 고객수
FROM 고객정보
GROUP BY 고객등급;

이 쿼리는 고객 등급별로 총구매금액의 평균값과 해당 등급에 속하는 고객 수를 계산해요. 이를 통해 각 고객 등급의 구매 패턴을 파악하고, 마케팅 전략을 수립하는 데 유용한 정보를 얻을 수 있겠죠?! 예를 들어, VIP 고객의 평균 구매 금액이 다른 등급에 비해 현저히 높다면, VIP 고객을 위한 특별 프로모션을 기획하는 등의 전략을 세울 수 있을 거예요.

복잡한 예시: 구매 횟수와 구매 금액 조합

자, 그럼 이제 좀 더 복잡한 예시를 살펴볼까요? 고객의 구매 횟수와 구매 금액을 함께 고려하여 고객 등급을 분류한다고 생각해 보세요. 이 경우에도 CASE WHEN 구문을 활용할 수 있답니다!

SELECT
    고객ID,
    고객명,
    총구매금액,
    구매횟수,
    CASE
        WHEN 총구매금액 >= 2000000 OR 구매횟수 >= 50 THEN 'VVIP'  -- 총구매금액 200만원 이상 또는 구매횟수 50회 이상
        WHEN 총구매금액 >= 1000000 OR 구매횟수 >= 30 THEN 'VIP'   -- 총구매금액 100만원 이상 또는 구매횟수 30회 이상
        WHEN 총구매금액 >= 500000 OR 구매횟수 >= 10 THEN '프리미엄' -- 총구매금액 50만원 이상 또는 구매횟수 10회 이상
        ELSE '일반'
    END AS 고객등급
FROM 고객정보;

이 쿼리는 총구매금액과 구매횟수를 조합하여 ‘VVIP’, ‘VIP’, ‘프리미엄’, ‘일반’의 네 가지 등급으로 고객을 분류해요. OR 연산자를 사용하여 조건을 조합했기 때문에, 두 조건 중 하나만 만족해도 해당 등급으로 분류된다는 점에 주의하세요! 이렇게 다양한 조건을 조합하여 CASE WHEN 구문을 활용하면 보다 정교한 데이터 분류가 가능해진답니다.

CASE WHEN 구문은 데이터 분석에 있어서 정말 강력한 도구예요! 데이터를 분류하고 그룹화하여 원하는 정보를 추출하고 분석하는 데 유용하게 활용할 수 있답니다. 다양한 조건과 함수를 조합하여 활용하면 더욱 풍부하고 정교한 분석 결과를 얻을 수 있을 거예요!

 

CASE WHEN과 다른 SQL 함수의 조합 활용

CASE WHEN 구문 자체만으로도 강력하지만, 다른 SQL 함수와 조합하면 그 활용도는 정말 무궁무진해져요! 마치 마법 지팡이에 새로운 주문을 배우는 것과 같달까요? CASE WHEN을 어떻게 다른 함수들과 함께 사용해서 데이터 분석에 날개를 달아줄 수 있는지, 함께 알아보도록 해요!

집계 함수와의 조합

자, 먼저 흔히 쓰이는 SUM(), AVG(), COUNT() 같은 집계 함수와 CASE WHEN을 어떻게 조합할 수 있을까요? 예를 들어, 특정 조건에 맞는 값들만 합산하거나 평균을 구하고 싶을 때가 있잖아요? 이럴 때 CASE WHEN 구문을 활용하면 아주 쉽게 해결할 수 있어요. 만약 ‘주문’ 테이블에서 ‘상품 종류’가 ‘A’인 상품의 ‘판매량’ 합계만 구하고 싶다면, 다음과 같은 쿼리를 작성할 수 있겠죠?

SELECT SUM(CASE WHEN 상품종류 = 'A' THEN 판매량 ELSE 0 END) AS A상품판매량합계 FROM 주문;

이 쿼리에서 CASE WHEN 구문은 ‘상품 종류’가 ‘A’인 경우에만 ‘판매량’을 반환하고, 그렇지 않은 경우에는 0을 반환해요. SUM() 함수는 이렇게 반환된 값들을 모두 합산해서 ‘A상품판매량합계’라는 이름으로 결과를 보여주죠! 참 쉽죠~? ^^

이와 비슷하게, 평균 ‘배송 기간’을 계산할 때에도 특정 ‘배송 상태’의 주문만 고려하고 싶다면 어떻게 해야 할까요? 예를 들어, ‘배송 완료’ 상태의 주문에 대한 평균 배송 기간만 계산하고 싶다면, 다음과 같은 쿼리를 사용할 수 있어요.

SELECT AVG(CASE WHEN 배송상태 = '배송 완료' THEN 배송기간 ELSE NULL END) AS 평균배송기간 FROM 주문;

여기서는 NULL 값을 활용했는데요, AVG() 함수는 NULL 값을 제외하고 계산하기 때문에 ‘배송 완료’ 상태가 아닌 주문은 평균 계산에서 제외되는 효과를 얻을 수 있어요! 이처럼 CASE WHEN과 집계 함수를 함께 사용하면 원하는 데이터만 정확하게 분석할 수 있답니다.

고객 등급별 평균 구매 금액 계산

자, 그럼 이제 좀 더 복잡한 예시를 살펴볼까요? 쇼핑몰에서 고객 등급을 ‘VIP’, ‘일반’, ‘신규’로 나누고, 각 등급별 평균 구매 금액을 계산한다고 생각해 보세요. 이때 CASE WHEN 구문을 활용하면 아주 효율적으로 쿼리를 작성할 수 있어요!

SELECT AVG(CASE WHEN 고객등급 = 'VIP' THEN 구매금액 END) AS VIP평균구매금액, AVG(CASE WHEN 고객등급 = '일반' THEN 구매금액 END) AS 일반평균구매금액, AVG(CASE WHEN 고객등급 = '신규' THEN 구매금액 END) AS 신규평균구매금액 FROM 주문;

이 쿼리는 각 고객 등급에 따라 평균 구매 금액을 한 번에 계산해 줘요. 각 CASE WHEN 구문은 해당 등급의 고객에 대한 구매 금액만 선택하고, AVG() 함수는 이 값들의 평균을 계산하죠. 정말 편리하지 않나요?

날짜 함수와의 조합

CASE WHEN은 날짜 함수와도 환상의 궁합을 자랑해요! 예를 들어, 특정 기간의 데이터만 추출하거나, 요일별 판매량을 분석하고 싶을 때 DATEPART() 함수와 CASE WHEN을 조합하면 아주 유용해요. ‘주문일자’를 기준으로 주말(토요일, 일요일) 판매량과 주중 판매량을 구분해서 계산하고 싶다면, 다음과 같이 쿼리를 작성할 수 있어요.

SELECT SUM(CASE WHEN DATEPART(weekday, 주문일자) IN (1, 7) THEN 판매량 ELSE 0 END) AS 주말판매량, SUM(CASE WHEN DATEPART(weekday, 주문일자) NOT IN (1, 7) THEN 판매량 ELSE 0 END) AS 주중판매량 FROM 주문;

DATEPART(weekday, 주문일자)는 요일을 숫자로 반환하는데, 일요일은 1, 토요일은 7로 표현돼요. CASE WHEN 구문을 활용해서 주말과 주중을 구분하고, 각각의 판매량을 합산하는 거죠! 이렇게 하면 요일별 판매량 분석을 훨씬 쉽게 할 수 있답니다.

다른 함수들과의 조합

이 외에도 문자열 함수, 변환 함수 등 다양한 SQL 함수와 CASE WHEN을 조합해서 활용할 수 있어요. SUBSTRING(), REPLACE(), CAST() 등의 함수와 함께 사용하면 데이터를 원하는 형태로 가공하고 분석하는 데 정말 큰 도움이 된답니다! 다양한 함수와 CASE WHEN을 조합해서 사용하는 방법을 익히면, SQL 활용 능력이 한층 더 업그레이드될 거예요! 마치 레고 블록처럼 다양한 함수들을 조합해서 원하는 결과를 만들어내는 재미를 느껴보세요! 데이터 분석의 세계가 더욱 흥미진진해질 거예요!

 

자, 이렇게 SQL의 강력한 도구, CASE WHEN문에 대해 알아봤어요! 마치 마법처럼 조건에 따라 데이터를 뽑아내고, 보기 좋게 정리까지 해주는 멋진 기능이죠. 처음엔 조금 어려워 보일 수도 있지만, 몇 번 연습하다 보면 어느새 능숙하게 데이터를 다루는 자신을 발견하게 될 거예요. 복잡한 쿼리문에 질려있었다면, CASE WHEN을 활용해서 훨씬 간결하고 효율적인 쿼리를 만들어 보는 건 어떨까요? 데이터 분석이 한결 즐거워질지도 몰라요! 앞으로 여러분의 데이터 분석 여정에 CASE WHEN이 든든한 동반자가 되어줄 거라고 믿어요. 더 궁금한 점이 있다면 언제든 질문해주세요!

 


코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다