Algorithm Solving/SQL

[programmers] SQL Lv. 4 - 주문량이 많은 아이스크림들 조회하기

기만나🐸 2025. 1. 10. 14:06

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

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

 


풀이

틀린 풀이 😿

SELECT SUB.FLAVOR 
FROM 
(
    SELECT 
        J.FLAVOR,
        (J.TOTAL_ORDER + IFNULL(F.TOTAL_ORDER, 0)) AS SUMTOTAL
    FROM JULY J
    LEFT JOIN FIRST_HALF F ON F.SHIPMENT_ID = J.SHIPMENT_ID
    ORDER BY SUMTOTAL DESC
) SUB
LIMIT 3

틀린 이유:

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

이 조건을 고려를 안하고 풀이..

출하 번호(`SHIPMENT_ID`)가 달라도 같은 맛(`FLAVOR`)일 경우 주문량은 합산해야 함!

 


GROUP BY - 7월 주문량 합산

SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL_ORDER
FROM JULY 
GROUP BY FLAVOR
  • `JULY` 테이블에서 같은 맛(`FLAVOR`)을 기준으로 주문량(`TOTAL_ORDER`)을 합산
  • 서로 다른 출하 번호(`SHIPMENT_ID`)라도 같은 맛의 아이스크림 주문량은 하나로 합산하여 `JULY_TOTAL_ORDER`로 출력

 


JOIN - 7월 주문량과 상반기 주문량 결합

SELECT *
FROM 
(
    SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL_ORDER
    FROM JULY 
    GROUP BY FLAVOR
) J
LEFT JOIN FIRST_HALF F ON F.FLAVOR = J.FLAVOR
  • 7월 주문량(`J`)과 상반기 주문량(`FIRST_HALF`)을 `FLAVOR`을 기준으로 JOIN한다.
    • 위의 "틀린 풀이"에서는 `JULY`테이블에는 있고 `FIRST_HALF`테이블에는 없는 `SHIPMENT_ID`를 고려해서 `LEFT JOIN`을 했지만
    • 현재는 `FLAVOR`로 결합하기 때문에 `LEFT JOIN`이 아닌 `JOIN`으로 결합해도 된다.
    • `LEFT JOIN`, `JOIN` 둘 다 조건에 맞다!
      (7월에만 존재하는 맛이 있었다면 `LEFT JOIN`만 맞음)
      (해당 문제에서는, 출하 번호만 차이가 있고 맛의 종류에는 차이가 없어서 `JOIN`도 맞음)

 


IFNULL - 총 주문량 계산

SELECT
    J.FLAVOR,
    IFNULL(J.JULY_TOTAL_ORDER, 0) + IFNULL(F.TOTAL_ORDER, 0) AS TOTAL_ORDER
FROM 
	-- 생략
  • 상반기 주문량과 7월 주문량의 합계를 계산
  • `IFNULL` 함수를 이용해서 `NULL`일 경우 `0`을 대입해서 계산되도록 한다.
  • 그런데, 위의 설명과 마찬가지로 `JULY`테이블과 `FIRST_HALF`테이블의 맛의 종류에는 차이가 없고,
    모든 컬럼이 `NULLABLE` `FALSE`이기 때문에, `IFNULL`없이 계산해도 조건에 맞는다.

 


LIMIT - 상위 3개 추출

SELECT *
FROM
	-- 생략
ORDER BY TOTAL_ORDER DESC
LIMIT 3
  • 위에서 만든 쿼리를 서브쿼리로 묶고 ORDER BY, LIMIT를 사용하면 주문량이 많은 순으로 3개 나열된다.

 


제출

-- 코드를 입력하세요
SELECT SUB.FLAVOR
FROM 
(
    SELECT
        J.FLAVOR,
        IFNULL(J.JULY_TOTAL_ORDER, 0) + IFNULL(F.TOTAL_ORDER, 0) AS TOTAL_ORDER
    FROM 
    (
        SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL_ORDER
        FROM JULY 
        GROUP BY FLAVOR
    ) J
    LEFT JOIN FIRST_HALF F ON F.FLAVOR = J.FLAVOR
) SUB
ORDER BY TOTAL_ORDER DESC
LIMIT 3

 

또는

SELECT SUB.FLAVOR
FROM 
(
    SELECT
        J.FLAVOR,
        J.JULY_TOTAL_ORDER + F.TOTAL_ORDER AS TOTAL_ORDER
    FROM 
    (
        SELECT FLAVOR, SUM(TOTAL_ORDER) AS JULY_TOTAL_ORDER
        FROM JULY 
        GROUP BY FLAVOR
    ) J
    JOIN FIRST_HALF F ON F.FLAVOR = J.FLAVOR
) SUB
ORDER BY TOTAL_ORDER DESC
LIMIT 3