SQL/MY SQL 문제 풀이(프로그래머스)

[MYSQL] PROGRAMMERS_식품분류별 가장 비싼 식품의 정보 조회하기

몽총한몽이네 2024. 2. 23. 18:32
반응형

WITH ms as (SELECT CATEGORY,MAX(PRICE) as MXP
                    FROM FOOD_PRODUCT
                    GROUP BY 1)

SELECT a.CATEGORY, MAX(PRICE)MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT as a, ms
WHERE a.CATEGORY = ms.CATEGORY
AND a.CATEGORY in ('과자', '국', '김치', '식용유')
AND PRICE = ms.MXP
GROUP BY 1
ORDER BY 2 desc

문제

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬

 

MAX가 중간에 들어가 있는 대상이 가장 귀찮다.. 그냥 컬럼별 MAX를 일치하게 해주는 코드가 있으면 좋겠는데 그런게 없어서 굳이 서브쿼리를 짜서 매칭을 시켜준 후 값을 구해야한다. 한번에 떠오를 수 있도록 조금 익숙해 질 필요가있다.

 

먼저 WITH 절을 통해서 카테고리별 최대 값을 구한다. GROUP BY CATEGORY 후 MAX(PRICE)를 SELECET 절에 위치시키면 카테고리별 최대값이 구해진다.

 

그후 메인 쿼리랑 조인을 해야하는데 메인쿼리는 카테고리,MAXPRICE, PRODUCT NAME을 가진다. 여기서 필터링 되어야 할 부분은  '과자', '국', '김치', '식용유'인 경우 이다. 따라서 WHERE 조건문에서 해당 조건을 필터링을 해준다. 

 

 여기서 중요 한거는 당연히 조인 되는 컬럼이 CATEGORY가 공통이라 조인 컬럼으로 연결 해준다 생각하지만

해당 카테고리가 연결되고 (AND) 메인쿼리의 PRICE와 서브쿼리의 MXP(MAX(PRICE)) 가 일치가 되어야 한다는 필터라는 점을 인식해야한다. 결국 카테고리의 최대값 두가지가 함께 AND 조건이 되는 값을 가진다는 의미이다. 

사실 이 두가지 조건으로 상품명을 찾는 쿼리와 다를바 없다.. 라고 생각하면 편할 것 같다.

그렇게 쿼리를 짜 준후에 기준은 당연히 CATEGORY 별 이니 카테고리로 짜준후 정렬하여 마무리한다.

 

반응형