코딩테스트/SQL

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

_알파카 2024. 7. 16. 02:03
728x90

문제 설명

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

문제의 조건과 테이블 정보는 다음과 같다. 

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;

 

 

728x90