새소식

Programmers Coding Test/MySQL

[프로그래머스 133026] MySQL - Level2 성분으로 구분한 아이스크림 총 주문량

  • -

 

성분으로 구분한 아이스크림 총 주문량

 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

1)  문제

다음은 아이스크림 가게의 상반기 주문 정보를 담은 FIRST_HALF 테이블과 
아이스크림 성분에 대한 정보를 담은 ICECREAM_INFO 테이블입니다. 

FIRST_HALF 테이블 구조는 다음과 같으며, SHIPMENT_ID, FLAVOR, TOTAL_ORDER 는 
각각 아이스크림 공장에서 아이스크림 가게까지의 출하 번호, 아이스크림 맛, 
상반기 아이스크림 총주문량을 나타냅니다. FIRST_HALF 테이블의 기본 키는 FLAVOR입니다.

 

NAME TYPE NULLABLE
SHIPMENT_ID INT(N) FALSE
FLAVOR VARCHAR(N) FALSE
TOTAL_ORDER INT(N) FALSE

 

 

 

ICECREAM_INFO 테이블 구조는 다음과 같으며, 
FLAVOR, INGREDITENT_TYPE 은 각각 아이스크림 맛, 아이스크림 성분 타입을 나타냅니다.

INGREDIENT_TYPE에는 아이스크림의 주 성분이 설탕이면 sugar_based라고 입력되고,
아이스크림의 주 성분이 과일이면 fruit_based라고 입력됩니다.
ICECREAM_INFO의 기본 키는 FLAVOR입니다.
ICECREAM_INFO테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.

 

NAME TYPE NULLABLE
FLAVOR VARCHAR(N) FALSE
INGREDIENT_TYPE VARCHAR(N) FALSE

 

 

문제
상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 

이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.

 

 

 

 

2)  예시

 

예를 들어 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

 

 

ICECREAM_INFO 테이블이 다음과 같다면

 

 

 

FLAVOR INGREDIENT_TYPE
chocolate sugar_based
vanilla sugar_based
mint_chocolate sugar_based
caramel sugar_based
white_chocolate sugar_based
peach fruit_based
watermelon fruit_based
mango fruit_based
strawberry fruit_based
melon fruit_based
orange fruit_based
pineapple fruit_based

 

 

상반기에 아이스크림의 주 성분이 설탕인 아이스크림들에 대한 총주문량을 구하면 3,200 + 2,800 + 1,700 + 2,600 + 3,100 = 13,400입니다.

아이스크림의 주 성분이 과일인 아이스크림들에 대한 총주문량을 구하면 3,100 + 2,450 + 2,150 + 2,900 + 3,150 + 2,900 + 2,900 = 19,550입니다. 따라서 총주문량이 작은 순서대로 조회하는 SQL 문을 실행하면 다음과 같이 나와야 합니다.

 

 

 

INGREDIENT_TYPE TOTAL_ORDER
sugar_based 13400
fruit_based 19550

 

 

 

 

3)  풀이

 

1. ICECREAM_INFO 테이블을 I, FIRST_HALF 테이블을 F로 지정합니다.

테이블에서 재료 타입, 해당 아이스크림의 주문량을 모두 더한 값(GROUB BY에 의해 같은 재료 타입인 것을 SUM해줌)을

구하고 'TOTAL_ORDER'열로 만들어줍니다.

● SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS `TOTAL_ORDER` FROM FIRST_HALF AS F

 

TOTAL_ORDER에 언더바인 특수문자가 있으므로 `` 백틱으로 감싸주었습니다.

 

 

2. ICECREAM_INFO 테이블과 FIRST_HALF 테이블을 연결합니다.

(ICECREAM_INFO테이블의 FLAVOR는 FIRST_HALF 테이블의 FLAVOR의 외래 키입니다.)

● INNER JOIN ICECREAM_INFO AS I ON I.FLAVOR = F.FLAVOR

 

 

※ JOIN

테이블 간의 연결 작업을 수행하는데 사용되는 키워드

 

JOIN 유형 설명 JOIN 조건
INNER JOIN 두 테이블 사이에서 일치하는 행만 반환합니다. 조건을 ON 절에 지정
LEFT JOIN
(LEFT OUTER JOIN)
왼쪽 테이블의 모든 행과 일치하는 오른쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
RIGHT JOIN
(RIGHT OUTER JOIN)
오른쪽 테이블의 모든 행과 일치하는 왼쪽 테이블의 행을 반환합니다. 조건을 ON 절에 지정
FULL OUTER JOIN 양쪽 테이블의 모든 행을 반환하며, 일치하지 않는 행은 NULL 값으로 채워집니다. 조건을 ON 절에 지정
CROSS JOIN 두 테이블의 모든 행을 조합하여 반환합니다. 조건이 필요 없음
NATURAL JOIN 두 테이블 사이에서 칼럼 이름이 동일한 칼럼들을 기반으로 일치하는 행을 반환합니다. 조건이 필요 없음
SELF JOIN 하나의 테이블을 여러 번 사용하여 자체와 조인하는 것을 의미합니다. 별명으로 조인
USING 절 두 테이블 사이에서 일치하는 칼럼들을 지정하여 사용합니다. 조건을 USING 절에 지정

 

 

 

 

 

 

3. 재료 타입으로 그룹화해줍니다. 결과값은 재료 타입별로 나오게 됩니다.

● GROUP BY I.INGREDIENT_TYPE

 

 

4. 총주문량이 작은 것부터 나열되게 합니다. (오름차순으로 해주면 됩니다.)

● ORDER BY `TOTAL_ORDER` ASC;

 

 

 

 

 

4)  코드

SELECT I.INGREDIENT_TYPE, SUM(F.TOTAL_ORDER) AS `TOTAL_ORDER` FROM FIRST_HALF AS F
INNER JOIN ICECREAM_INFO AS I ON I.FLAVOR = F.FLAVOR
GROUP BY I.INGREDIENT_TYPE
ORDER BY `TOTAL_ORDER` ASC;

 

 

 

 

 

 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.