문제링크
문제 설명
다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블입니다. FOOD_PRODUCT 테이블은 다음과 같으며 PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD CATEGORY PRICE는 식품 ID, 식품 이름, 식품 코드, 식품분류, 식품 가격을 의미합니다.
Column name | Type | Nullable |
PRODUCT_ID | VARCHAR(10) | FALSE |
PRODUCT_NAME | VARCHAR(50) | FALSE |
PRODUCT_CD | VARCHAR(10) | TRUE |
CATEGORY | VARCHAR(10) | TRUE |
PRICE | NUMBER | TRUE |
문제
FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해 주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해 주세요.
예시
FOOD_PRODUCT 테이블이 다음과 같을 때
PRODUCT_ID | PRODUCT_NAME | PRODUCT_CD | CATEGORY | PRICE |
P0018 | 맛있는고추기름 | CD_OL00008 | 식용유 | 6100 |
P0019 | 맛있는카놀라유 | CD_OL00009 | 식용유 | 5100 |
P0020 | 맛있는산초유 | CD_OL00010 | 식용유 | 6500 |
P0021 | 맛있는케첩 | CD_SC00001 | 소스 | 4500 |
P0022 | 맛있는마요네즈 | CD_SC00002 | 소스 | 4700 |
P0039 |
맛있는황도 | CD_CN00008 | 캔 | 4100 |
P0040 | 맛있는명이나물 | CD_CN00009 | 캔 | 3500 |
P0041 | 맛있는보리차 | CD_TE00010 | 차 | 3400 |
P0042 | 맛있는메밀차 | CD_TE00001 | 차 | 3500 |
P0099 | 맛있는맛동산 | CD_CK00002 | 과자 | 1800 |
SQL문을 실행하면 다음과 같이 출력되어야 합니다.
CATEGORY | MAX_PRICE | PRODUCT_NAME |
식용유 | 6500 | 맛있는산초유 |
과자 | 1800 | 맛있는맛동산 |
코드
WITH TEMP AS (
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('과자', '국', '김치', '식용유')
)
SELECT T.CATEGORY, T.MAX_PRICE, F.PRODUCT_NAME
FROM FOOD_PRODUCT F
INNER JOIN TEMP T
ON F.CATEGORY = T.CATEGORY
AND F.PRICE = T.MAX_PRICE
ORDER BY 2 DESC;
WITH 절
먼저, FOOD_PRODUCT 테이블에서 카테고리가 과자, 국, 김치, 식용유인 경우 그룹화하여 CATEGORY, PRICE의 최댓값을 조회하는 테이블을 WITH 절로 선언한다.
선언한 WITH 절은 다음과 같이 조회된다.
CATEGORY | MAX_PRICE |
식용유 | 8950 |
김치 | 1900 |
국 | 2900 |
과자 | 1950 |
SELECT ~ FROM 절
WITH 절로 선언한 TEMP 테이블의 CATEGORY, MAX_PRICE 컬럼과 FOOD_PRODUCT 테이블의 PRODUCT_NAME 컬럼을 조회한다.
JOIN ON 절
FOOD_PRODUCT 테이블(F)과 TEMP 테이블(T)을 INNER JOIN 한다. 조인 조건으로 F 테이블의 CATEGORY와 T 테이블의 CATEGORY가 같고, F 테이블의 PRICE와 T 테이블의 MAX_PRICE가 같은 경우 조인하도록 한다.
ORDER BY 절
MAX_PRICE를 기준으로 내림차순 정렬한다.
WITH 절로 선언하여 조인한 이유
PRODUCT_NAME은 CATEGORY로 그룹화할 때, MAX_PRICE에 알맞은 PRODUCT_NAME을 조회해 주는 것이 아니라 CATEGORY로 그룹화할 때 테이블의 상단에 있는 데이터를 가져오기 때문이다.
물론 WITH 절을 사용하는 방법이 아닌 서브쿼리로도 쿼리 작성이 가능하다.
'코딩 테스트(Coding Test) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 서울에 위치한 식당 목록 출력하기 - MySQL (0) | 2023.06.18 |
---|---|
[프로그래머스] 5월 식품들의 총매출 조회하기 - MySQL (0) | 2023.06.17 |
[프로그래머스] 보호소에서 중성화한 동물 - MySQL (0) | 2023.06.15 |
[프로그래머스] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - MySQL (0) | 2023.06.14 |
[프로그래머스] 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 - MySQL (0) | 2023.06.13 |