https://school.programmers.co.kr/learn/courses/30/lessons/133027
특정 맛에 대해, (7월에 판매된 양 + 상반기에 판매된 양)이 큰 순서대로 3가지 맛을 출력하는 문제이다.
JOIN의 특징과 테이블의 속성을 알면 쉽게 풀 수 있는 문제이다.
우선 7월에 판매된 양을 보자.
7월 테이블의 FLAVOR 는 기본키가 아니다.
따라서 FLAVOR 에 같은 맛이 중복될 수 있다.
우선 이 문제를 해결해야한다.
WITH JULY_GROUP AS (
SELECT
FLAVOR
, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM
JULY
GROUP BY
FLAVOR
)
다음으로는 두 테이블을 합치는 것이다.
INNER JOIN 을 하면 상반기에 있는 맛과 7월에 있는 맛 중
공통으로 존재하는 맛만 추출될 것이다.
그리고 한 가지 더 눈여겨봐야할 점은
7월 테이블 FLAVOR 는 상반기 테이블 FLAVOR 의 외래키다.
7월 테이블 FLAVOR 에 있는 모든 맛은 상반기 테이블 FLAVOR 에 있다는 뜻이다.
상반기 테이블 FLAVOR 에 없는 값이 7월 테이블 FLAVOR 에 있는 경우도 없다.
따라서 이 경우에는 상반기 테이블에다가 7월 테이블을 LEFT JOIN 해야한다.
그러면서 총 판매량을 더해주자.
WITH TOTAL_GROUP AS (
SELECT
A.FLAVOR
, A.TOTAL_ORDER + B.TOTAL_ORDER AS TOTAL_ORDER
FROM
FIRST_HALF A
LEFT JOIN
JULY_GROUP B
ON
A.FLAVOR = B.FLAVOR
)
이제 위 TOTAL_GROUP 테이블을 가지고 TOTAL_ORDER 를 기준으로 내림차순하면서 FLAVOR 를 LIMIT 3으로 추출하면된다.
추가로 문제 조건과는 다르게
만약 7월 테이블 FLAVOR 에도 상반기 테이블 FLAVOR 에 없는 값이 있을 경우에는 LEFT JOIN 이 아닌 FULL OUTER JOIN 을 해야 할 것이다.
WITH JULY_GROUP AS (
SELECT
FLAVOR
, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM
JULY
GROUP BY
FLAVOR
), TOTAL_GROUP AS (
SELECT
A.FLAVOR
, A.TOTAL_ORDER + B.TOTAL_ORDER AS TOTAL_ORDER
FROM
FIRST_HALF A
LEFT JOIN
JULY_GROUP B
ON
A.FLAVOR = B.FLAVOR
)
SELECT
FLAVOR
FROM
TOTAL_GROUP
ORDER BY
TOTAL_ORDER DESC
LIMIT
3
더 좋은 해결방법이 있다면 언제든 댓글로 알려주세요 🤗