JB의 이모저모
[Programmers Lv.4] 주문량이 많은 아이스크림들 조회하기 (MySQL) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/133027
문제 설명
다음은 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF
테이블과 7월의 아이스크림 주문 정보를 담은 JULY
테이블입니다. FIRST_HALF
테이블 구조는 다음과 같으며, SHIPMENT_ID
, FLAVOR
, TOTAL_ORDER
는 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF
테이블의 기본 키는 FLAVOR
입니다. FIRST_HALF
테이블의 SHIPMENT_ID
는 JULY
테이블의 SHIPMENT_ID
의 외래 키입니다.
NAME | TYPE | NULLABLE |
---|---|---|
SHIPMENT_ID | INT(N) | FALSE |
FLAVOR | VARCHAR(N) | FALSE |
TOTAL_ORDER | INT(N) | FALSE |
JULY
테이블 구조는 다음과 같으며, SHIPMENT_ID
, FLAVOR
, TOTAL_ORDER
은 각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 7월 아이스크림 총주문량을 나타냅니다. JULY
테이블의 기본 키는 SHIPMENT_ID
입니다. JULY
테이블의 FLAVOR
는 FIRST_HALF
테이블의 FLAVOR
의 외래 키입니다. 7월에는 아이스크림 주문량이 많아 같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다.
NAME | TYPE | NULLABLE |
---|---|---|
SHIPMENT_ID | INT(N) | FALSE |
FLAVOR | VARCHAR(N) | FALSE |
TOTAL_ORDER | INT(N) | FALSE |
문제
7월 아이스크림 총 주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하는 SQL 문을 작성해주세요.
예시
예를 들어 FIRST_HALF
테이블이 다음과 같고
SHIPMENT_ID | FLAVOR | TOTAL_ORDER |
---|---|---|
101 | chocolate | 3200 |
102 | vanilla | 2800 |
103 | mint_chocolate | 1700 |
104 | caramel | 2600 |
105 | white_chocolate | 3100 |
106 | peach | 2450 |
107 | watermelon | 2150 |
108 | mango | 2900 |
109 | strawberry | 3100 |
110 | melon | 3150 |
111 | orange | 2900 |
112 | pineapple | 2900 |
JULY
테이블이 다음과 같다면
SHIPMENT_ID | FLAVOR | TOTAL_ORDER |
---|---|---|
101 | chocolate | 520 |
102 | vanilla | 560 |
103 | mint_chocolate | 400 |
104 | caramel | 460 |
105 | white_chocolate | 350 |
106 | peach | 500 |
107 | watermelon | 780 |
108 | mango | 790 |
109 | strawberry | 520 |
110 | melon | 400 |
111 | orange | 250 |
112 | pineapple | 200 |
208 | mango | 110 |
209 | strawberry | 220 |
7월 아이스크림 총주문량과 상반기의 아이스크림 총 주문량을 더한 값이 큰 순서대로 상위 3개의 맛을 조회하면 strawberry(520 + 220 + 3,100 = 3,840), mango(790 + 110 + 2,900 = 3,800), chocolate(520 + 3,200 = 3,720) 순입니다. 따라서 SQL 문을 실행하면 다음과 같이 나와야 합니다.
FLAVOR |
---|
strawberry |
mango |
chocolate |
⭕ CODE
SELECT F.FLAVOR
FROM FIRST_HALF AS F
JOIN JULY AS J
ON F.FLAVOR = J.FLAVOR
GROUP BY F.FLAVOR
ORDER BY F.TOTAL_ORDER +SUM(J.TOTAL_ORDER) DESC
LIMIT 3
SELECT A.FLAVOR
FROM (
SELECT * FROM FIRST_HALF
UNION ALL
SELECT * FROM JULY
) AS A
GROUP BY A.FLAVOR
ORDER BY SUM(A.TOTAL_ORDER) DESC
LIMIT 3
✏️ Comment
위 문제들의 FIRST_HALF 테이블과 JULY 테이블을 출력해보면
FIRST_HALFJULY
위 처럼 나온다. 여기서 만약 요구조건대로 따라한 결과는
위 그림 처럼 나와야한다.
사람들이 정답은 나오지만 틀린 풀이로 많이 작성했는데 그 코드는
SELECT F.FLAVOR FROM FIRST_HALF AS F JOIN JULY AS J ON F.FLAVOR = J.FLAVOR GROUP BY F.FLAVOR ORDER BY SUM(F.TOTAL_ORDER) +SUM(J.TOTAL_ORDER) DESC LIMIT 3
이런 식으로 작성하였다. 이코드를 실행하면 딸기의 총 판매량이 (3100 + 3100 + 520 + 220) 하여 6940이 나온다.
그래서 첫번째 코드는 FIRST_HALF에는 상반기 주문 정보이므로 맛별로 총주문량이 나와있다고 판단하였다. 즉 맛 중복 없음 그리고 JULY에는 문제에서도 적혀 있듯 '같은 아이스크림에 대하여 서로 다른 두 공장에서 아이스크림 가게로 출하를 진행하는 경우가 있습니다. 이 경우 같은 맛의 아이스크림이라도 다른 출하 번호를 갖게 됩니다.' 이라는 조건이 있어서 맛 별로 그룹화하고 J.TOTAL_ORDER 7월의 주문량만 SUM 합해주었다.
두번째 코드는 UNION ALL을 이용한 코드이다. 간단하게 설명하자면 UNION ALL은 두개의 테이블을 합치면서 중복을 제거하지 않고 모두 보여준다. 그래서 FIRST_HALF와 JULY 테이블을 UNION ALL해준다음 맛으로 그룹화 하여 총합을 구해주었다.
- UNION 에 대해서 알게 되었다. 조만간 공부하여 다루어보겠다.
'SQL > 프로그래머스' 카테고리의 다른 글
[Programmers Lv.4] 그룹별 조건에 맞는 식당 목록 출력하기 (MySQL) (0) | 2023.10.03 |
---|---|
[Programmers Lv.4] 5월 식품들의 총매출 조회하기 (MySQL) (0) | 2023.10.02 |
[Programmers Lv.3] 오랜 기간 보호한 동물(1) (MySQL) (0) | 2023.10.02 |
[Programmers Lv.3] 있었는데요 없었습니다 (MySQL) (1) | 2023.10.02 |
[Programmers Lv.3] 없어진 기록 찾기 (MySQL) (0) | 2023.10.02 |