[내일배움캠프 사전캠프] + SQL (4)

천미진·2025년 4월 28일
  • subquery문이 필요할 때
    여러 번의 연산을 수행 / 조건문에 연산 결과 사용 / 조건에 query 결과를 사용하고 싶을 때
  • subquery 구조
    예) 음식 준비시간이 25분보다 초과한 시간을 가져오기
select order_id, restaurant_name, if(over_time>=0, over_time, 0) over_time
from 
(
select order_id, restaurant_name, food_preparation_time-25 over_time
from food_orders
) a

* ()안의 select, from 구하고 앞에 select from 구하기 수학이랑 동일 () 먼저 구하기 *
  • [실습] 음식점의 평균 단가별 segmentation 을 진행하고, 그룹에 따라 수수료 연산하기
select restaurant_name,
       price_per_plate*ratio_of_add "수수료"
from 
(
select restaurant_name,
       case when price_per_plate<5000 then 0.005
            when price_per_plate between 5000 and 19999 then 0.01
            when price_per_plate between 20000 and 29999 then 0.02
            else 0.03 end ratio_of_add,
       price_per_plate
from 
(
select restaurant_name, avg(price/quantity) price_per_plate
from food_orders
group by 1
) a
) b

해석 순서 a -> b -> 맨 앞
a: food_orders에서 restaurant_name(별명: price_per_plate)의 평균 단가 구함
b: case when문으로 평균 단가에 따른 부가 비율을 나눔
맨 앞: price_per_plate * ratio_of_add 계산 수수료 구하기

  • [실습] 음식점의 지역과 평균 배달시간으로 segmentation 하기
select restaurant_name,
		"시도",
		avg_delivery_time,
		case when avg_delivery_time<=20 then '<=20'
			 when avg_delivery_time between 21 and 30 then '20<x<=30'
		else '>30' end delivery_time_segment
from
(
select restaurant_name,
substr(addr, 1, 2) "시도".
avg (delivery_time) avg_delivery_time
from food_orders
group by 1, 2
) a

해석 순서 a -> 맨 앞
a: food_orders에서 restaurant_name과 "시도"를 기준으로 평균 배달 시간 구하기
맨 앞: 평균 배달 시간에 따라 분류

Group by 절 헷갈림 -> 평균 배달 시간을 구할 때 레스토랑 이름과 지역을 기준으로 계산한다는 의미로 group by절 사용

profile
데이터 분석 병아리

0개의 댓글