ღ yuni_world ღ

[MySQL] [프로그래머스 level 4] 주문량이 많은 아이스크림들 조회하기 본문

MySQL/프로그래머스

[MySQL] [프로그래머스 level 4] 주문량이 많은 아이스크림들 조회하기

ღ유닝이ღ 2025. 11. 11. 19:01

📌 문제링크

https://school.programmers.co.kr/learn/courses/30/lessons/133027

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제풀이

1. UNION ALL 사용

with

raw as (
    select * from FIRST_HALF
    union all
    select * from JULY
)

, raw2 as (
    select *, row_number() over(order by total_order desc) as rn 
    from (select flavor, sum(total_order) as total_order
        from raw
        group by flavor) as a
)
    
select flavor
from raw2
where rn <= 3
order by rn
  • union all 사용한 이유?
    • 데이터 양이 많지 않고 두 테이블의 컬럼명과 형식이 모두 같았기 때문에 join보다 더 간편한 방법이라고 생각
  • row_number() 를 사용하여 '상반기+7월 의 아이스크림 총주문량' 에 대한 순서를 부여한 후 where절을 활용하여 상위 3개의 행만 가져옴

 

2. JOIN 사용

with 

raw as (
    select *, row_number() over(order by total_order desc) as rn
    from (select flavor, sum(a.total_order) + sum(b.total_order) as total_order
        from FIRST_HALF a left join JULY b using(flavor)
        group by flavor) as a
)

select flavor
from raw
where rn <= 3
order by rn
  • left join을 사용한 이유?
    • 원래대로면 full outer join 을 활용해야 맞다고 생각하지만 mysql에는 지원되지 않는 형식
    • 그렇다면 left join 과 right join, union 을 활용하여 쿼리를 작성해야함
    • 하지만 데이터 양이 많지 않고, first_half 테이블의 sample 데이터 양이 더 많았기 때문에 그나마 안전하고 편의상 left join 사용 ( left join 활용해도 정답처리 됨)
  • FIRST_HALF, JULY 두 테이블을 조인하는 컬럼명이 FLAVOR로 같기 때문에 using 사용
  • row_number() 를 사용하여 '상반기+7월 의 아이스크림 총주문량' 에 대한 순서를 부여한 후 where절을 활용하여 상위 3개의 행만 가져옴