[프로그래머스] LEVEL4 식품분류별 가장 비싼 식품의 정보 조회하기(SQL)

Loopy·2023년 10월 19일
1

프로그래머스

목록 보기
30/32
post-thumbnail

[프로그래머스] LEVEL4 식품분류별 가장 비싼 식품의 정보 조회하기


🧐 문제 설명


😍 나의 풀이

처음에는 단순하게 "GROUP BY로 데이터를 식품분류별 그룹화한 후 MAX()값을 출력해야겠다"라고 접근했다가 틀렸다고 나와서 잘못된 원인을 찾는데 오래 걸렸던 문제였습니다. 처음에는 아래 SQL처럼, CATEGORY 별로 GROUP BY를 수행한다음 HAVING 조건절을 사용하여 데이터를 출력했습니다.

잘못된 풀이

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

잘못된 풀이 결과는 '김치' 카테고리의 가장 비싼 식품의 이름은 '맛있는 배추김치'이고, '식용유' 카테고리는 '맛있는 콩기름', '국' 카테고리는 '맛있는 미역국', '과자' 카테고리는 '맛있는 포카칩'으로 조회되었습니다.

하지만 전체 테이블을 조회해봤을 때, 식품분류별 가장 비싼 식품의 이름은 '김치' - '맛있는 배추김치', '식용유' - '맛있는 마조유', '국'-'맛있는 김치찌개', '과자'-'맛있는 허니버터칩'으로 제가 처음 작성한 쿼리 결과와 차이가 있었습니다.

이유는 기존 쿼리에서 SELECT 문에 있는 MAX()는 GROUP BY된 식품분류별 데이터의 가장 비싼 가격을 가져올 뿐, 가장 비싼 식품의 행에 있는 다른 정보(PRODUCT_ID, PRODUCT_NAME)는 가져오지 못했습니다. 그러니까 다시 말해서, 최대금액만 SELECT한 것이지, 이 금액의 다른 정보와는 매칭되지 않는 조회 쿼리였습니다.

그래서 서브 쿼리를 이용해서 최대금액을 먼저 뽑아내고, 이 최대 금액이 포함되는 행의 CATEGORY, MAX_PRICE, PRODUCT_NAME을 SELECT하는 방법을 이용했습니다.

  1. GROUP BY를 사용하여 데이터를 식품분류별 그룹화

  2. 식품분류별 가장 비싼 가격(MAX_PRICE) 구하기

  3. 서브쿼리와 WHERE - IN절을 사용하여 가장 비싼 가격이 포함된 데이터 찾기

  4. 서브쿼리와 WHERE - IN절을 사용하여 '과자', '국', '김치', '식용유'가 포함된 데이터 찾기

정답 풀이

SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) 
                FROM FOOD_PRODUCT
                GROUP BY CATEGORY) 
    AND CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY PRICE DESC;
profile
공부 쫌 해!!!😂

0개의 댓글