프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
SELECT T.FLAVOR
FROM (
SELECT F.FLAVOR,
F.TOTAL_ORDER AS HALF_TOTAL,
COALESCE(S.JULY_TOTAL, 0) AS JULY_TOTAL,
F.TOTAL_ORDER + COALESCE(S.JULY_TOTAL, 0) AS SUM_TOTAL
FROM FIRST_HALF AS F
LEFT JOIN (
SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL
FROM JULY
GROUP BY FLAVOR
) AS S
ON F.FLAVOR = S.FLAVOR
) AS T
ORDER BY T.SUM_TOTAL DESC
LIMIT 3;
확실히 LEVEL4의 위엄을 느낀 문제였다.
문제를 보게 되면
7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다. - JULY 테이블
JULY테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.
다음과 같은 설명이 있다.
같은 맛임에도 불구하고 다른 출하 번호를 가질 수 있기 때문에 헷갈리는 부분이 많았다.
처음 도출했던 테이블이다.
SHIPMENT_ID | FLAVOR | TOTAL_ORDER | SHIPMENT_ID | FLAVOR | TOTAL_ORDER |
---|---|---|---|---|---|
104 | caramel | 460 | 104 | caramel | 2600 |
101 | chocolate | 520 | 101 | chocolate | 3200 |
103 | mint_chocolate | 400 | 103 | mint_chocolate | 1700 |
106 | peach | 500 | 106 | peach | 2450 |
109 | strawberry | 520 | 109 | strawberry | 3100 |
209 | strawberry | 220 | 109 | strawberry | 3100 |
102 | vanilla | 560 | 102 | vanilla | 2800 |
105 | white_chocolate | 350 | 105 | white_chocolate | 3100 |
왼쪽은 FIRST_HALF
테이블, 오른쪽은 JULY
테이블이며 FLAVOR을 바탕으로 JOIN을 한 테이블이다.
두 테이블의 TOTAL_ORDER
의 합을 구하기 전, strawberry가 중복 값이 발생한 것을 확인할 수 있다.
이를 해결하고자 JOIN하는 쿼리 이전에 JULY
테이블을 FLAVOR
를 기준으로 GROUPBY
하여 테이블을 생성하였다.
SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL
FROM JULY
GROUP BY FLAVOR
) AS S
해당 테이블과 FIRST_HALF
테이블을 JOIN하여 값을 구할 수 있었다.
서브쿼리, 혹은 WITH 테이블과 같은 내용은 아직 어려운 것 같다.
부족함을 많이 느낀 문제지만 나름 해결 잘한 것 같다.
LEFT JOIN: 7월 주문이 없던 맛도 JULY_TOTAL = 0으로 포함하려고(누락 방지).
COALESCE: 7월 데이터가 없으면 NULL이 되니 0으로 바꿔서 안전하게 합산.
sum_total: 상반기 + 7월을 계산한 최종 지표.