SQL에서의 case when, 서브쿼리

ch.2·2024년 6월 27일

SQL

목록 보기
3/9
post-thumbnail

case when

음식 타입(cuisine_type)을 'Korean' 일 때는 '한식', 'Japanese' 혹은 'Chinses'일 때는 '아시아', 그 외에는 '기타'라고 지정

select case when cuisine_type = 'Korean' then '한식'
 			when cuisine_type in ('Japanese', 'Chinese') then '아시아'
 			else '기타' end "음식 타입",
 	   cuisine_type
from food_orders

같은 컬럼 내의 조건이 여러 개일 때는 when 컬럼명 in ('조건1', '조건2') then 나올 값의 형태로 사용한다.
현재 내가 사용하는 MySQL에서는 case when 구문의 각 when 절에 대한 구분은 컴마를 사용하지 않는다.
조건문을 닫을 때는 end를 사용하고, else에 부합하는 부분이 없다면 else를 생략할 수 있다.

case when 구문에 다른 조건 붙이기

지역과 배달시간을 기반으로 배달수수료 구하기 (식당 이름, 주문 번호 함께 출력)
(지역 : 서울, 기타 - 서울일 때는 수수료 계산 * 1.1, 기타일 때는 곱하는 값 없음
시간 : 25분, 30분 - 25분 초과하면 음식 가격의 5%, 30분 초과하면 음식 가격의 10%)

select restaurant_name,
	   order_id,
	   case when delivery_time>30 then price*0.1*if(addr like '서울%', 1.1, 1)
	   		when delivery_time>25 then price*0.02 *if(addr like '서울%', 1.1, 1)
	   		else 0 end "수수료"
from food_orders

지역(addr), 배달시간(delivery_time), 식당 이름(restaurant_name), 주문 번호(order_id)

case when 구문에 다른 조건을 붙일 때는 if 함수를 *을 사용하며 붙이면 된다.
if: 주소가 서울이라면 1.1을 곱하고 서울이 아니라면 1을 곱해서 원상태 그대로 두는 내용.

괄호를 이용한 서브쿼리

여러 번의 연산을 수행해야 할 때, 조건에 쿼리 결과를 사용하고 싶을 때 서브쿼리를 이용한다.
복잡한 연산 시, 최종 결과를 반환하기 위한 중간 테이블의 역할!
가장 많이 사용하는 서브쿼리는 인라인 뷰로, from 절에서 사용하며 하나의 테이블처럼 사용한다. 따라서 별명을 반드시! 기재해야 한다. 간단하게 a 라는 별명을 많이 사용하는 듯 하다.

음식점의 총 주문 수량과 주문 금액을 연산하고, 주문 수량을 기반으로 수수료 할인율 구하기
(수량이 5개 이하 → 10%
수량이 15개 초과, 총 주문 금액이 300000 이상 → 0.5%
이 외에는 일괄 1%)

SELECT restaurant_name,
	   case when sum_of_quantity<=5 then 0.1
	   		when sum_of_quantity>15 and sum_of_price>=300000 then 0.005
	   		else 0.1 end ratio_of_add
FROM 
(
select restaurant_name,
	   sum(quantity) sum_of_quantity,
	   sum(price) sum_of_price
from food_orders fo
group by 1
) a;

음식점 이름(restaurant_name), quantity(주문 수량), price(주문 금액)
총 주문 수량을 sum_of_quantity, 총 주문 금액을 sum_of_price, 수수료 할인율을 ratio_of_add

서브쿼리문으로 연산 결과를 활용할 것이기 때문에 서브쿼리문에 총 주문 수량과 총 주문 금액을 구하는 식을 적고 연산 결과에 대한 별명을 설정했다. 그리고 본쿼리(?)에서 수수료 할인율에 대한 조건을 설정했다.

tip!

별명은 서브쿼리문, 컬럼, 테이블 모두에 설정 가능하다.
한 쿼리를 끝내고 싶을 때는 ;를 사용한다. 엔터를 세 번 누르지 않아도 된다!!!

profile
데이터 분석 공부중

0개의 댓글