[프로그래머스][MySQL] Lv. 4 주문량이 많은 아이스크림들 조회하기
문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/133027
문제의 조건과 테이블 정보는 다음과 같다.
FIRST_HALF : 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량
JULY : 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 7월 아이스크림 총주문량
- 7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회
- 7월에는 아이스크림 주문량이 많아 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 될 수 있다.
내 풀이
먼저, 정답 풀이는 아래와 같다.
SELECT j.FLAVOR
FROM JULY j LEFT JOIN FIRST_HALF f
ON j.SHIPMENT_ID = f.SHIPMENT_ID
GROUP BY j.FLAVOR
ORDER BY SUM(j.TOTAL_ORDER) + SUM(f.TOTAL_ORDER) DESC
LIMIT 3;
차근차근 순서대로 구해보자!
1. JULY 테이블과 FIRST_HALF 테이블을 'SHIPMENT_ID'을 기준으로 LEFT 조인한다.
문제에서 7월에는 주문량이 많다고 하였으니, 기준을 JULY 테이블로 지정하고,
LEFT JOIN을 사용하여 JULY 테이블에 있는 결과를 모두 포함하며,
같은 출하번호을 기준으로 FIRST_HALF 테이블의 데이터도 포함하게 된다.
만약, JULY 테이블에 있는 출하번호가 FIRST_HALF 테이블에 없다면, 빈 값으로 나오게 된다.
SELECT *
FROM JULY j LEFT JOIN FIRST_HALF f
ON j.SHIPMENT_ID = f.SHIPMENT_ID
결과는 아래와 같다.
2. 각 'FLAVOR' 별로 그룹을 짓고, 7월 주문량, 상반기 총 주문량, 7월과 상반기 주문량을 합한 값을 출력해본다.
다음으로, 7월과 상반기 주문량을 합한 값을 기준으로 정렬하며, 상위 3개의 아이스크림 정보를 조회해본다.
SELECT j.FLAVOR,
SUM(j.TOTAL_ORDER) AS JULY_ORDER,
SUM(f.TOTAL_ORDER) AS TOTAL_ORDER,
(SUM(j.TOTAL_ORDER) + SUM(f.TOTAL_ORDER)) AS tmp
FROM JULY j LEFT JOIN FIRST_HALF f
ON j.SHIPMENT_ID = f.SHIPMENT_ID
GROUP BY j.FLAVOR
ORDER BY tmp DESC
LIMIT 3;
결과는 아래와 같다!
3. 문제에서 주어진 조건대로 아이스크림의 맛만 출력한다.
다른 사람 풀이
SELECT F.FLAVOR
FROM FIRST_HALF F
INNER JOIN (SELECT FLAVOR, sum(TOTAL_ORDER) AS JULY_TOTAL_ORDER
FROM JULY
GROUP BY FLAVOR) J
ON F.FLAVOR = J.FLAVOR
ORDER BY TOTAL_ORDER + JULY_TOTAL_ORDER DESC
LIMIT 3;