안녕하세요! 데코입니다!
오늘은 프로그래머스 코딩테스트 연습에 있는 "식품분류별 가장 비싼 식품의 정보 조회하기" 문제를 포스팅하려고 합니다!
바로 포스팅 시작할게요! :)
(출처 : 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을 통해 큰 값의 정보들을 붙이고 원하는 정보만을 추출했습니다!
이 외에는 이전 문제들에서 모두 다룬 것들을 이용해서
따로 코멘트할 것은 없네요!
혹시나 더 좋은 쿼리나 어렵게 느껴지신 부분이 있다면 댓글로 남겨주세요!
설명이 어려운 부분 혹은 잘 이해가 안 가는 부분
그리고 더 궁금한 내용이 있다면
언제든지 댓글로 남겨주세요!
빠르게 궁금증을 해결해 드릴게요!
공감과 댓글은 큰 힘이 됩니다!
오늘도 블로그 방문해 주시고
포스팅 읽어주셔서 감사합니다!
![](https://t1.daumcdn.net/keditor/emoticon/niniz/large/010.gif)
'Skill Sets > SQL' 카테고리의 다른 글
[SQL] 월별 잡은 물고기 수 구하기(프로그래머스/MySQL/Level 2) (31) | 2024.06.03 |
---|---|
[SQL] 물고기 종류 별 잡은 수 구하기(프로그래머스/MySQL/Level 2) (33) | 2024.05.26 |
[SQL] 조건별로 분류하여 주문상태 출력하기(프로그래머스/MySQL/Level 3) (59) | 2024.02.03 |
[SQL] 5월 식품들의 총매출 조회하기(프로그래머스/MySQL/Level 4) (51) | 2024.01.29 |
[SQL] 그룹별 조건에 맞는 식당 목록 출력하기(프로그래머스/MySQL/Level 4) (76) | 2024.01.19 |