본문 바로가기

Skill Sets/SQL

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

SMALL

 

안녕하세요! 데코입니다!

 

오늘은 프로그래머스 코딩테스트 연습에 있는 "식품분류별 가장 비싼 식품의 정보 조회하기" 문제를 포스팅하려고 합니다!

 

바로 포스팅 시작할게요! :)

(출처 : https://school.programmers.co.kr/learn/courses/30/lessons/131116)


 

1. 문제 :  식품분류별 가장 비싼 식품의 정보 조회하기(Lv. 4)

 


 

2. 문제 설명

 

 

다음은 식품의 정보를 담은 FOOD_PRODUCT 테이블입니다. FOOD_PRODUCT 테이블은 다음과 같으며

PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE는

 식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.

 

[ 테이블 구조('FOOD_PRODUCT') ]

COLUMN NAME TYPE NULLABLE
PRODUCT_ID VARCHAR(10) FALSE
PRODUCT_NAME VARCHAR(50) FALSE
PRODUCT_CD VARCHAR(10) TRUE
CATEGORY VARCHAR(10) TRUE
PRICE NUMBER TRUE

 

 

[ 문제 ]

 

FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼

식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요.

이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고

결과는 식품 가격을 기준으로 내림차순 정렬해주세요.

 

[ 예시 ]

 

예를 들어 FOOD_PRODUCT 테이블이 다음과 같고

PRODUCT_ID PRODUCT_NAME PRODUCT_CD CATEGORY PRICE
P0018 맛있는고추기름 CD_OL00008 식용유 6100
P0019 맛있는카놀라유 CD_OL00009 식용유 5100
P0020 맛있는산초유 CD_OL00010 식용유 6500
P0021 맛있는케첩 CD_SC00001 소스 4500
P0022 맛있는마요네즈 CD_SC00002 소스 4700
P0039 맛있는황도 CD_SC00008 4100
P0040
맛있는명이나물 CD_SC00009 3500
P0041
맛있는보리차 CD_TE00010 3400
P0042 맛있는메밀차 CD_TE00001 3500
P0099
맛있는맛동산 CD_CK00012 과자 1800

 

SQL을 실행하면 다음과 같이 출력되어야 합니다.

 

[ 출력 결과 ]

CATEGORY MAX_PRICE PRODUCT_NAME
식용유 6500 맛있는산초유
과자 1800 맛있는맛동산

 


 

3. 문제 풀이

-- 1안
SELECT  FP.CATEGORY
        , FP.PRICE AS MAX_PRICE
        , FP.PRODUCT_NAME
  FROM  FOOD_PRODUCT FP
  JOIN  (
        SELECT  CATEGORY
                , MAX(PRICE) MAX_PRICE
          FROM  FOOD_PRODUCT FP
         GROUP
            BY  CATEGORY
        ) M_FP
    ON  FP.CATEGORY = M_FP.CATEGORY
        AND FP.PRICE = M_FP.MAX_PRICE
 WHERE  1=1
        AND FP.CATEGORY IN ('과자', '국', '김치', '식용유')
 ORDER
    BY  MAX_PRICE DESC

 

 

이번 문제는 총 1안 한 가지로 작성했습니다!

 

#  1안 풀이 설명

# [ 문제 접근 설명 ]


문제를 읽고 조건에 맞는 쿼리를 작성하기 위해서 다음과 같이  네 가지 단계로 진행했어요!

1. FOOD_PRODUCT 테이블에서 가격이 가장 비싼 CATEGORY 정보 추출

2. FOOD_PRODUCT 테이블에서  1번에서 추출한 정보 결합(JOIN)

3. 과자, 국, 김치, 식용유 CATEGORT만을 추출(WHERE)
4. 금액 기준으로 내림차순 정렬(ORDER BY)

 

# [ 1안 쿼리 작성 설명 ]

 

 1  첫 번째 단계에서는 FOOD_PRODUCT 테이블에서 카테고리별 가장 비싼 식품을 가져오는 쿼리를 수행했습니다!

 

MAX(). 함수를 이용했어요!

 


SELECT   CATEGORY
                 , MAX(PRICE) MAX_PRICE
    FROM   FOOD_PRODUCT FP
 GROUP
         BY   CATEGORY

 

 

 2  두 번째 단계에서는 FOOD_PRODUCT 테이블과 첫 번째 단계에서 생성한 쿼리를 JOIN 해 주었어요!

 

첫 번째 단계에서 생성한 쿼리를 서브쿼리로 넣은 후 JOIN을 했습니다!

 


SELECT   *

   FROM   FOOD_PRODUCT FP
    JOIN    (
                SELECT  CATEGORY
                                 , MAX(PRICE) MAX_PRICE
                   FROM    FOOD_PRODUCT FP
                GROUP
                        BY   CATEGORY
                 ) M_FP

 

 

 3  세 번째 단계에서는 WHERE문을 통해 특정 카테고리 데이터만을 추출했습니다.

 

CATEGORT  컬럼에서 과자, 국, 김치, 식용유만을 가져왔어요!

 

그리고 SELECT 문에 필요한 컬럼들을 나타내주었습니다.

 


SELECT   FP.CATEGORY

                 , FP.PRICE AS MAX_PRICE
                 , FP.PRODUCT_NAME
   FROM   FOOD_PRODUCT FP
    JOIN    (
                SELECT  CATEGORY
                                 , MAX(PRICE) MAX_PRICE
                   FROM    FOOD_PRODUCT FP
                GROUP
                        BY   CATEGORY
                 ) M_FP
        ON   FP.CATEGORY = M_FP.CATEGORY
                 AND FP.PRICE = M_FP.MAX_PRICE
 WHERE  1=1
                 AND FP.CATEGORY IN ('과자', '국', '김치', '식용유')

 

 

 4  네 번째 단계에서는 요구사항에 맞게 정렬했어요!

식품가격(MAX_PRICE) 기준 내림차순으로 정렬했습니다!

 


SELECT   FP.CATEGORY
                 , FP.PRICE AS MAX_PRICE
                 , FP.PRODUCT_NAME
   FROM   FOOD_PRODUCT FP
    JOIN    (
                SELECT  CATEGORY
                                 , MAX(PRICE) MAX_PRICE
                   FROM    FOOD_PRODUCT FP
                GROUP
                        BY   CATEGORY
                 ) M_FP
        ON   FP.CATEGORY = M_FP.CATEGORY
                 AND FP.PRICE = M_FP.MAX_PRICE
 WHERE  1=1
                 AND FP.CATEGORY IN ('과자', '국', '김치', '식용유')
 ORDER
         BY   MAX_PRICE DESC

 

 

정답...!


 

4. 데코의 문제 풀이 후기

 

이번 문제에는 서브쿼리에서 GROUP BY와 함께 MAX() 함수를 통해 가장 큰 값의 정보를 추출하고

 

LEFT JOIN을 통해 큰 값의 정보들을 붙이고 원하는 정보만을 추출했습니다!

 

이 외에는 이전 문제들에서 모두 다룬 것들을 이용해서

따로 코멘트할 것은 없네요!

혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요! 

 




설명이 어려운 부분 혹은 잘 이해가 안 가는 부분

그리고 더 궁금한 내용이 있다면

언제든지 댓글로 남겨주세요!

빠르게 궁금증을 해결해 드릴게요!

공감과 댓글은 큰 힘이 됩니다!

오늘도 블로그 방문해 주시고

포스팅 읽어주셔서 감사합니다!

 

 

 

 

LIST