데이터분석 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

 

아직은 실력이 한참 모자라다고 느낀 실습이었다... ^^