문제 풀이/SQL

[SQL] [programmers] 성분으로 구분한 아이스크림 총 주문량

일 월 2023. 2. 14. 09:12

코딩테스트 연습 - 성분으로 구분한 아이스크림 총 주문량 | 프로그래머스 스쿨 (programmers.co.kr)

 

프로그래머스

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

programmers.co.kr

 


문제 설명

FIRST_HALF 테이블

: 아이스크림 가게의 상반기 주문 정보 (기본 키 :  FLAVOR)

NAME TYPE NULLABLE 나타내는 값
SHIPMENT_ID INT(N) FALSE 아이스크림 공장에서 아이스크림 가게까지의 출하 번호
FLAVOR VARCHAR(N) FALSE 아이스크림 맛
TOTAL_ORDER INT(N) FALSE 상반기 아이스크림 총주문량

 

ICECREAM_INFO 테이블

: 아이스크림 성분에 대한 정보 (기본 키, 외래 키 :  FLAVOR)

NAME TYPE NULLABLE 나타내는 값
FLAVOR VARCHAR(N) FALSE 아이스크림 맛
INGREDIENT_TYPE VARCHAR(N) FALSE 아이스크림의 성분 타입
(주 성분이 설탕이면 sugar_based,  주 성분이 과일이면 fruit_based)

 

문제

상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량총주문량이 작은 순서대로 조회하는 SQL 문을 작성해주세요. 이때 총주문량을 나타내는 컬럼명은 TOTAL_ORDER로 지정해주세요.

 

조회 예시

INGREDIENT_TYPE TOTAL_ORDER
sugar_based 13400
fruit_based 19550

 


접근법

-- 1. 조회할 값은 ICECREAM_INFO 테이블의 INGREDIENT_TYPE과
-- INGREDIENT_TYPE별로 FIRST_HALF 테이블의 각 FLAVOR별 TOTAL_ORDER를 더한 값
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER)

-- 2. FIRST_HALF에 INGREDIENT_TYPE이 있었다면, GROUP BY를 이용해 각 FLAVOR를 INGREDIENT_TYPE별로
-- 묶어주고, TOTAL_ORDER 값을 더해주면 된다.
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) FROM FIRST_HALF GROUP BY INGREDIENT_TYPE;

-- 3. 두 테이블에 원하는 정보가 분산되어 있으니, JOIN을 이용해 두 테이블을 묶어준다.
SELECT INGREDIENT_TYPE, SUM(TOTAL_ORDER) FROM FIRST_HALF JOIN ICECREAM_INFO
GROUP BY INGREDIENT_TYPE;

-- 4. 테이블의 별칭을 만들어 조회할 컬럼을 정확히 명시한다.
SELECT i.INGREDIENT_TYPE, SUM(f.TOTAL_ORDER) FROM FIRST_HALF f JOIN ICECREAM_INFO i
GROUP BY INGREDIENT_TYPE;

-- 5. 두 테이블에 공통으로 존재하는 FLAVOR 컬럼을 기준으로 JOIN한다.
SELECT i.INGREDIENT_TYPE, SUM(f.TOTAL_ORDER) FROM FIRST_HALF f JOIN ICECREAM_INFO i
ON f.FLAVOR = i.FLAVOR GROUP BY INGREDIENT_TYPE;

-- 6. 총주문량 컬럼의 별칭을 설정해주고, 총주문량이 적은 순으로 정렬해준다.
SELECT i.INGREDIENT_TYPE, SUM(f.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF f JOIN ICECREAM_INFO i
ON f.FLAVOR = i.FLAVOR GROUP BY i.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;

-- 7. JOIN 조건이 맞는지 확인한다. 공통된 행만 출력하는 것이므로 INNER JOIN을 사용한다.
-- (my sql에서는 INNER JOIN 대신 JOIN을 사용해도 된다.)
SELECT i.INGREDIENT_TYPE, SUM(f.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF f INNER JOIN ICECREAM_INFO i
ON f.FLAVOR = i.FLAVOR GROUP BY i.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;

 

풀이

-- MY SQL
SELECT i.INGREDIENT_TYPE, SUM(f.TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF f INNER JOIN ICECREAM_INFO i
ON f.FLAVOR = i.FLAVOR GROUP BY i.INGREDIENT_TYPE
ORDER BY TOTAL_ORDER;