본문 바로가기

SQL/프로그래머스

SQL 프로그래머스 6일차_5 최대값구하여 최대값에 맞는 ROW 추출

 

 

GROUP BY 유의점
-- GROUP BY 로 그룹으로 묶은 컬럼별 최대값은 찾을수 있지만 GROUP BY만으로는 최대값에 맞는 다른 컬럼(이름,ID)는 조회할수 없다,


-- 다만 WHERE에서 IN을 사용해 최대값과 동일한 값을 가진 데이터를 조회하면 ID,이름 등 최대값에 맞는 ROW을 맞게 추출할수 있다. 

 

 

문제

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

 

테이블 소개

테이블 예제

시도 코드 

- 문제점 

문제가 카테고리별 최대값을 조회하는 것인데 최대값을 구했으나 최대값에 맞는 상품 ID와 상품명이 일치하지 않았다

SELECT A.PRODUCT_ID, A.CATEGORY, A.PRODUCT_NAME, RANK() OVER(ORDER BY TOP_PRICE DESC) AS C ,PRICE 
FROM  FOOD_PRODUCT A
JOIN (SELECT  PRODUCT_ID, CATEGORY, PRODUCT_NAME, MAX(PRICE) AS TOP_PRICE
     FROM FOOD_PRODUCT
     GROUP BY CATEGORY) B
ON A.PRODUCT_ID = B.PRODUCT_ID
SELECT CATEGORY , MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT 
GROUP BY CATEGORY 
HAVING CATEGORY IN ('과자', '국', '김치', '식용유','면')
ORDER BY MAX_PRICE DESC

- 시도한 코드들이 틀린 이유

카테고리가 면인 식품의 최고 금액인 상품은 4950원에 P0003 , 맛있는짜장 이지만 

시도한 코드로 조회한 테이블에서는 가격은 4950이 맞지만 맛있는 라면이라고 되었있다

가격과 상품 명이 동일하지 않다는 것을 알수 있다,

시도한 코드로 조회한 테이블 

정답 코드 

SELECT  CATEGORY,PRICE AS MAX_RICE,PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE)  FROM FOOD_PRODUCT GROUP BY CATEGORY)
            AND CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY MAX_RICE DESC

 

GROUP BY 유의점

그룹별 최대수만 조회한다면 일반 그룹바이만 사용하지만

두가지 컬럼 외에 다른 ID, 이름 등 최대수에 일치하는 컬럼들을 조회하기 위해서는 

WHERE 서브쿼리를 이용해야한다.