코딩 테스트 연습/[프로그래머스][리트코드] MySQL

[LV.5] JOIN > 주문량이 많은 아이스크림들 조회하기

duswjd_data 2025. 7. 8. 09:40

문제

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

 

프로그래머스

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

programmers.co.kr


문제 설명

  • 7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성
  • 7월에는 아이스크림 주문량이 많아, 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행
    이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됨

정답 코드

SELECT F.FLAVOR
FROM FIRST_HALF F JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) AS S_TOTAL_ORDER
                        FROM JULY
                        GROUP BY FLAVOR) J ON F.FLAVOR = J.FLAVOR
ORDER BY F.TOTAL_ORDER + J.S_TOTAL_ORDER DESC
LIMIT 3

코드 설명

# 서브쿼리

SELECT FLAVOR, SUM(TOTAL_ORDER) AS S_TOTAL_ORDER
FROM JULY
GROUP BY FLAVOR

 

  • JULY 테이블에서 FLAVOR 별로 총 주문량(TOTAL_ORDER)을 합산
FROM FIRST_HALF F JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) AS S_TOTAL_ORDER
                        FROM JULY
                        GROUP BY FLAVOR) J ON F.FLAVOR = J.FLAVOR
  • 상반기 주문량(TOTAL_ORDER)과 7월의 주문량(S_TOTAL_ORDER)을 맛(FLAVOR)을 기준으로 합치기
ORDER BY F.TOTAL_ORDER + J.S_TOTAL_ORDER DESC
  • FIRST_HALF 테이블의 TOTAL_ORDER(상반기 주문량)와 J 서브쿼리에서 구한 S_TOTAL_ORDER(7월 주문량)을 더한 값을 기준으로 내림차순 정렬 (= 총 주문량이 큰 순서대로 결과를 정렬)
LIMIT 3
  • 정렬된 결과 중 상위 3개만 추출 (= 총 주문량이 가장 큰 3개의 맛을 추출)

 


첫 번째 시도 (오류)

SELECT F.FLAVOR
FROM FIRST_HALF F JOIN JULY J ON F.FLAVOR = J.FLAVOR
GROUP BY FLAVOR
HAVING SUM(J.TOTAL_ORDER) + DISTINCT(F.TOTAL_ORDER)
ORDER BY SUM(J.TOTAL_ORDER) + DISTINCT(F.TOTAL_ORDER) DESC
LIMIT 3
  • SUM(J.TOTAL_ORDER) + DISTINCT(F.TOTAL_ORDER) : 문법상 오류
    • DISTINCT는 중복된 값을 제거할 때 사용되며, SUM 함수와 함께 직접적으로 사용할 수 없음

두 번째 시도 (정답. 개선 필요)

SELECT F.FLAVOR
FROM FIRST_HALF F JOIN (SELECT FLAVOR, SUM(TOTAL_ORDER) S_TOTAL_ORDER
                        FROM JULY
                        GROUP BY FLAVOR) J ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY F.TOTAL_ORDER + J.S_TOTAL_ORDER DESC
LIMIT 3
  • FIRST_HALF 테이블에서 이미 FLAVOR별로 고유 값만 있기 때문에 GROUP BY가 불필요 (JOIN만 해도 괜찮음)