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 별 이니 카테고리로 짜준후 정렬하여 마무리한다.
'SQL > MY SQL 문제 풀이(프로그래머스)' 카테고리의 다른 글
[MYSQL] PROGRAMMERS_취소되지 않은 진료 예약 조회하기 (0) | 2024.02.23 |
---|---|
[MYSQL] PROGRAMMERS_ 5월 식품들의 총매출 조회하기 (0) | 2024.02.23 |
[MYSQL] PROGRAMMERS_보호소에서 중성화한 동물 (1) | 2024.02.23 |
[MYSQL] PROGRAMMERS_대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.02.23 |
[MYSQL] PROGRAMMERS_헤비 유저가 소유한 장소 (0) | 2024.02.23 |