프로그래머스 SQL 고득점 킷 식품분류별 가장 비싼 식품의 정보 조회하기

hysss·2023년 2월 18일
0

GROUP BY - 식품분류별 가장 비싼 식품의 정보 조회하기

문제 분석

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;

Nested query를 이용한 코드

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를 사용하지 않을 수 있다.
어떻게 보면 좀 더 깔끔한 것 같기도 하다.

profile
매일 매일 규칙적으로

0개의 댓글