0. IF문 / CASE문이 유용한 이유
범주 별로 값을 구할 때 사용하는 대표적인 SQL문법은 Group By절이다.
그런데 만약 범주 별로 다른 연산(계산, 문자바꾸기)을 적용하고 싶다면?
이럴 때 사용할 수 있는 것이 IF문과 CASE문이다.
IF문과 CASE문을 사용하면 새로운 카테고리를 만들고, 그 안에서 각자 다른 연산을 적용할 수 있다.
IF문과 CASE문에 대해 자세히 알아보자.
1. IF()문 집중 분석
1-1) IF문
: 조건에 따라 다른 방법을 적용하고 싶을 때
: 원하는 조건을 충족할 때 적용할 방법과 충족하지 못했을 때 적용할 방법을 지정해줄 수 있음
if(조건, 조건을 충족할 때, 조건을 충족하지 못할 때)
1-2) IF문 실습문제
문제1) 한식 음식점일 경우에는 '한식', 한식음식점이 아닐 경우에는 '기타'라고 지정
SELECT restaurant_name ,
cuisine_type ,
IF(cuisine_type = 'Korean', '한식', '기타') Korean_food
FROM food_orders fo
문제2) 주소가 평택 '문곡리'인 경우에만 '문곡리'를 '문가리'로 수정하기
▶ REPLACE 함수(문자 바꾸기 함수)를 모르면 풀 수 없는 문제
[참고 게시글]
[IT 교육/SQL] - SQL | REPLACE / SUBSTR / SUBSTRING_INDEX / CONCAT 함수 정리 + 실습 문제
SELECT addr ,
IF(addr LIKE '%평택%', REPLACE(addr,'문곡리','문가리'), addr) new_addr
FROM food_orders fo
WHERE addr LIKE '%문곡리%'
문제3) 이메일 도메인 중에 잘못된 이메일 주소(gmail) 수정하기
▶ 현재 원본 데이터의 email 컬럼 중 gmail.com 앞에 '@'가 빠져 있음.
▶ 잘못된 이메일 주소 gmail 앞에 @붙여주기
SELECT SUBSTR(IF(email like '%gmail%', REPLACE(email, 'gmail', '@gmail'), email), 10) email_domain,
COUNT(customer_id) count_customer,
AVG(age) avg_age
FROM customers c
Group By 1
2. CASE문 집중 탐구
2-1) CASE문
: 조건을 두 개 이상 지정하고 싶을 때 사용
: 여러 번의 IF문을 적용한 효과를 낼 수 있음 if(조건1, 값1, if(조건2, 값2, 값3))
CASE WHEN 조건1 THEN 값(수식)1
WHEN 조건2 THEN 값(수식)2
ELSE 값(수식)3
END
2-2) CASE문 실습문제
문제1) 음식 타입이 'Korean'일 때는 '한식',
'Japanese' 혹은 'Chinese'일 때는 '아시아',
그 외에는 '기타'라고 지정
SELECT restaurant_name,
cuisine_type,
CASE WHEN cuisine_type = 'Korean' THEN '한식'
WHEN cuisine_type = 'Japanese' or 'Chinese' THEN '아시아'
ELSE '기타'
END food_type
FROM food_orders fo
문제2) 음식 단가 지정하기
- 주문수량이 1일 때는 음식 가격으로, 주문 수량이 2개 이상일 때는 음식가격/주문수량으로 지정
SELECT order_id ,
price ,
quantity ,
CASE WHEN quantity = 1 THEN price
WHEN quantity >= 2 THEN price/quantity
END unit_price
FROM food_orders fo
문제3) 다음 조건으로 배달 시간이 늦었는지 판단하기
- 주중: 25분 이상
- 주말: 30분 이상
SELECT order_id,
restaurant_name,
day_of_the_week,
delivery_time ,
CASE WHEN day_of_the_week = 'Weekday' and delivery_time >= 25 THEN 'Late'
WHEN day_of_the_week = 'Weekday' and delivery_time < 25 THEN 'On-time'
WHEN day_of_the_week = 'Weekend' and delivery_time >= 30 THEN 'Late'
WHEN day_of_the_week = 'Weekend' and delivery_time < 30 THEN 'On-time'
END late_or_not
FROM food_orders fo
문제4) 새로운 카테고리 만들기_User Segmentation 해보기
- 10세 이상, 30세 미만의 고객을 나이와 성별로 그룹 나누기
SELECT name,
age,
CASE WHEN (age BETWEEN 10 AND 19) AND gender = 'male' THEN '10대 남자'
WHEN (age BETWEEN 10 AND 19) AND gender = 'female' THEN '10대 여자'
WHEN (age BETWEEN 20 AND 29) AND gender = 'male' THEN '20대 남자'
WHEN (age BETWEEN 20 AND 29) AND gender = 'female' THEN '20대 여자'
END age_gender_group
FROM customers c
WHERE age BETWEEN 10 and 29
'데이터분석 과정 > SQL' 카테고리의 다른 글
SQL | JOIN(조인)할 때 ON절의 컬럼명, 꼭 같아야 할까 (0) | 2024.01.08 |
---|---|
SQL | 서브쿼리(Subquery) 사용법 정리 | 서브쿼리 예제 (2) | 2024.01.08 |
SQL | REPLACE / SUBSTR / SUBSTRING_INDEX / CONCAT 함수 정리 + 실습 문제 (1) | 2024.01.07 |
SQL | 윈도우 함수(Window Function) 사용법 정리 | RANK함수, SUM함수 (1) | 2024.01.07 |
SQL | DISTINCT 탐구_뜻밖의 여정 | Group by절과의 사용법 차이 (1) | 2024.01.06 |
댓글