코딩 테스트(Coding Test)/프로그래머스

[프로그래머스] 식품분류별 가장 비싼 식품의 정보 조회하기 - MySQL

잇트루 2023. 6. 16. 00:20
반응형

문제링크

 

프로그래머스

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

programmers.co.kr

 

 

문제 설명

다음은 식품의 정보를 담은 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 절을 사용하는 방법이 아닌 서브쿼리로도 쿼리 작성이 가능하다.

반응형