FOOD_PRODUCT 테이블에
식품분류별로
가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요.
이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고
결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
WITH MAX_PRICE AS (
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('과자', '국', '김치', '식용유'))
SELECT FOOD_PRODUCT.CATEGORY, MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT JOIN MAX_PRICE ON FOOD_PRODUCT.CATEGORY=MAX_PRICE.CATEGORY
WHERE PRICE=MAX_PRICE
ORDER BY MAX_PRICE DESC;
SELECT CATEGORY, PRICE MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY, PRICE) IN (SELECT CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('과자', '국', '김치', '식용유'))
ORDER BY MAX_PRICE DESC
이 문제는 SELECT 절에서 GROUP BY절에서 사용했던 attribute를 사용하지 않는 문제였다.
그렇기 때문에 서브 쿼리나 WITH절로 임시 테이블을 만들어서 사용해야 했다.
나는 임시 테이블에서 식품분류별로 Grouping을 수행하고, HAVING절로 Group을 필터링하고, 그 그룹의 가격 중 최대 값을 MAX() 함수로 구해서 MAX_PRICE라는 이름으로 Column에 추가했다.
그리고 원래 테이블인 FOOD_PRODUCT와 JOIN을 해서 MAX_PRICE를 가져오고, 이를 이용해서 정답을 출력했다.
두 번째 풀이는 Join 대신 WHERE절에서의 Nested query를 이용한 풀이 방법이다.
이 방법도 SELECT 절에서 GROUP BY절에서 사용했던 attribute를 사용하지 않을 수 있다.
어떻게 보면 좀 더 깔끔한 것 같기도 하다.