데이터분석 6기/사전캠프
[TIL] 데이터 분석 사전캠프 5일차 - 서브쿼리 실습
seyeon1130
2025. 1. 17. 18:12
서브쿼리 실습
오늘부터는 빠른 실력 향상을 위해 실습을 한 후 강의를 보도록 한다.

1) 풀이 방법
- 평균 단가별 segmentation 진행

2) 수수료 계산하기

이렇게 하면 완성 ! 그런데 food_orders와 a 테이블에 있는 그룹 네임이 어떻게 알아서 조인이 됐지..? 하고 의문이 들었다.
그래서 챗 gpt 에게 물어본 결과!
암시적 조인: 서브쿼리 a와 원본 테이블 food_orders(fo)를 조인하는 과정에서 restaurant_name 컬럼을 기준으로 데이터가 암시적으로 연결됩니다.
SELECT fo.restaurant_name, a.평균단가, fo.price,
CASE WHEN group_name = "A" THEN fo.price * 0.05
WHEN group_name = "B" THEN fo.price * 0.1
WHEN group_name = "C" THEN fo.price * 0.2
WHEN group_name = "D" THEN fo.price * 0.3
END AS "수수료"
FROM (SELECT restaurant_name, AVG(price) AS "평균단가",
CASE WHEN AVG(price) < 5000 THEN "A"
WHEN AVG(price) BETWEEN 5000 AND 20000 THEN "B"
WHEN AVG(price) BETWEEN 20000 AND 30000 THEN "C"
WHEN AVG(price) > 30000 THEN "D"
END AS group_name
FROM food_orders
GROUP BY restaurant_name) a
JOIN food_orders fo
ON a.restaurant_name = fo.restaurant_name;
가독성과 유지보수를 위해 이 방식을 더욱 추천한다고 한다.
정답을 확인했는데 내가 간과한 사실이 있었다.
- between에는 경계 숫자들이 포함 된다는 것! 따라서 20000이 아닌 19999, 30000이 아닌 29999로 작성해야한다.
- 이 문제는 메뉴마다 수수료를 계산하는 것이 아닌, 각 가게가 내야하는 수수료를 계산하는 문제였따..
- 평균이 아닌 평균 단가이기 때문에 quantity로 나눠야한다...
그래서 아주 살짝 수정했다!

명시된 정답은
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
아직은 실력이 한참 모자라다고 느낀 실습이었다... ^^