[알고리즘] 식품분류별 가장 비싼 식품의 정보 조회하기

2023. 10. 5. 13:20알고리즘 풀이/SQL

문제 설명
다음은 식품의 정보를 담은 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	맛있는맛동산

나의 풀이

- 쿼리를 하나만 쓰기에는 최고가의 product_name을 가져올 수가 없는 문제가 생긴다.

- 이를 해결하기 위해 서브 쿼리를 만들어 키 값이 될 수 있는 category와 max(price)만 찾아 비교하여 최종 선별하는 작업을 거친다.

- 만약 max(price)만 사용하게 될 경우 중복된 값이 존재할 수 있고 만약 이 값이 해당 category내에 최고가가 아닌 값이라면 틀리는 문제가 생긴다. 따라서 category와 max(price)를 함께 써야 한다.

- in 을 쓰기 위해서는 []와 같이 리스트가 아닌 튜플 형식을 사용해야 한다.

- price를 프로그래머스의 열 이름인 max_price와 동등하게 맞추어 주지 않았다. 이런 것도 이제는 신경쓰자!!!

select category, price, product_name from food_product
where (category, price) in (
select category, max(price) as max_price from food_product
where category in ('과자', '국', '김치', '식용유')
group by category
)
order by price desc