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

iinnuyh_s·2024년 1월 4일
0

SQL

목록 보기
6/17
post-thumbnail
post-custom-banner

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

풀이

  • LEVEL 4,,, 쉽지 않았다. 서브쿼리를 여기서 처음 써본 것 같다.
  • 우선, 서브쿼리인지 모르고, 간단한 GROUP BY 문제인지 알고 이렇게 썼었다.
    😵 틀린 풀이
    SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
    FROM FOOD_PRODUCT
    WHERE CATEGORY IN("과자","국","김치","식용유")
    GROUP BY CATEGORY
    ORDER BY MAX_PRICE DESC;
    • 사실 이렇게 풀고 테스트케이스 돌리면, 정답 코드랑 정답은 같게 나온다. 그래서 왜 틀린지를 전혀 몰랐다
    • 하지만!! 최대가격과 같은 가격을 갖는 음식이 여러개인 경우? 이렇게 하면 뭐가 나올지 모른다. 왜냐, GROUP BY 그룹 조건에 카테고리는 있지만,PRODCUT_NAME은 그룹 조건에 없어서 랜덤값이 나오기 때문이다.
    • 그래서 서브쿼리를 써 주고, 그 테이블과 원래 테이블을 JOIN해서 찾아줘야 하는 것!
  • 서브쿼리로 각 카테고리별 최대금액과 카테고리를 나타내는 테이블을 만들어주고, 그 테이블과 FOOD_PRODUCT 테이블을 JOIN 하면서, 최대금액과 같은 금액을 갖고, 카테고리도 같은 행들을 찾으면 되는 것이다.
    🙆‍♀️ 정답 코드
    SELECT A.CATEGORY, A.PRICE AS MAX_PRICE, A.PRODUCT_NAME
    FROM FOOD_PRODUCT A JOIN (
        SELECT MAX(PRICE) AS PRICE, CATEGORY 
        FROM FOOD_PRODUCT
        GROUP BY CATEGORY
        HAVING CATEGORY IN ('과자','국','김치','식용유')
    ) B ON A.CATEGORY=B.CATEGORY AND A.PRICE=B.PRICE
    ORDER BY A.PRICE DESC;
    1. ()안이 서브쿼리. GROUP BY CATEGORY를 통해 각 카테고리별로 그룹화를 진행했고, MAX(PRICE) 집계함수를 이용하여 각 카테고리의 최대 금액을 구해줬다.
    2. 각 식품분류가 '과자','국','김치','식용유' 인 경우만 출력 해야 하는 조건 때문에 HAVING CATEGORY IN () 조건을 써줬다.
    3. 서브쿼리를 B 테이블로 명시하고, FOOD_PRODUCT를 A 테이블로 설정하여 둘을 조인하는데, 조인조건을 A.CATEGORY=B.CATEGORY AND A.PRICE = B.PRICE로 주었다. 즉, 식품분류별 가장 비싼 식품을 조회한 것.
    4. 정렬 조건을 위해 ORDER BY 써줌.

난이도가 좀 있는 sql문제에서 서브쿼리는 무조건 나올 수밖에 없다. 서브쿼리 조인할 때 문법도 꼭꼭 외워놓기!!

➕ 보충

  • WHERE 절 서브쿼리를 쓰면 JOIN 절 안쓰고 조금 더 간단하게 구현 가능
    SELECT CATEGORY, PRICE as MAX_PRICE, PRODUCT_NAME
    FROM FOOD_PRODUCT
    WHERE (CATEGORY, PRICE) IN (
        SELECT CATEGORY, MAX(PRICE) as PRICE
        FROM FOOD_PRODUCT
        WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
        GROUP BY CATEGORY)
    ORDER BY PRICE desc
post-custom-banner

0개의 댓글