프로그래머스 SQL 고득점 Kit - 주문량이 많은 아이스크림들 조회하기

Jinyoung Cheon·2025년 8월 14일
0

코딩테스트

목록 보기
17/25

프로그래머스 SQL 고득점 Kit
https://school.programmers.co.kr/learn/challenges?tab=sql_practice_kit

JOIN

problem

7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.

code

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;

note

확실히 LEVEL4의 위엄을 느낀 문제였다.

문제를 보게 되면

7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다. - JULY 테이블

JULY테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.

다음과 같은 설명이 있다.
같은 맛임에도 불구하고 다른 출하 번호를 가질 수 있기 때문에 헷갈리는 부분이 많았다.

처음 도출했던 테이블이다.

SHIPMENT_IDFLAVORTOTAL_ORDERSHIPMENT_IDFLAVORTOTAL_ORDER
104caramel460104caramel2600
101chocolate520101chocolate3200
103mint_chocolate400103mint_chocolate1700
106peach500106peach2450
109strawberry520109strawberry3100
209strawberry220109strawberry3100
102vanilla560102vanilla2800
105white_chocolate350105white_chocolate3100

왼쪽은 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월을 계산한 최종 지표.

profile
데이터를 향해, 한 걸음씩 천천히.

0개의 댓글