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
'Algorithm Solving > SQL' 카테고리의 다른 글
[programmers] SQL Lv. 3 - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2025.01.14 |
---|---|
[programmers] SQL Lv. 4 - 저자 별 카테고리 별 매출액 집계하기 (0) | 2025.01.13 |
[programmers] SQL Lv. 3 - 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2025.01.09 |
[programmers] SQL Lv. 4 - 우유와 요거트가 담긴 장바구니 (0) | 2025.01.08 |
[programmers] SQL Lv. 1 - 과일로 만든 아이스크림 고르기 (0) | 2025.01.08 |