🤔 문제
다음은 식품의 정보를 담은 `FOOD_PRODUCT` 테이블입니다.
`FOOD_PRODUCT` 테이블은 다음과 같으며 `PRODUCT_ID`, `PRODUCT_NAME`, `PRODUCT_CD`, `CATEGORY`, `PRICE`는 식품 ID, 식품 이름, 식품코드, 식품분류, 식품 가격을 의미합니다.
`FOOD_PRODUCT` 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요.
이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
예시
`FOOD_PRODUCT` 테이블이 다음과 같을 때
SQL을 실행하면 다음과 같이 출력되어야 합니다.
💻 나의 풀이 (틀림)
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY 1 -- 식품분류별로 묶기
ORDER BY 2 DESC; -- 가격 내림차순
결과
🖍 오답노트
틀린 이유
`MAX(PRICE) AS MAX_PRICE`로 카테고리에서의 최대 가격은 맞지만, 최대 가격에 해당되는 상품이름이 불일치하기 때문에 틀렸다.
`MAX`로 조회할 경우, 해당하는 컬럼에 대한 값만 나오고 그 값이 포함된 행 전체가 나오지 않게된다.
`MAX_PRICE`에 해당되는 제품명을 조회하는 것이 아니라, `CATEGORY`로 그룹화할 때 테이블의 상단에 있는 데이터를 가져오기 때문이다.
그래서 서브쿼리나 WITH절로 한번 필터링한 후 조회해야 한다.
💡 정답 풀이
1. 서브쿼리를 활용한 방법
SELECT CATEGORY, PRICE AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
-- (카테고리, 최대가격)을 구하여 비교를 통해 이 값에 해당하는 행을 출력
WHERE (CATEGORY, PRICE) IN ( -- 카테고리, 가격 두 개 값이 동시에 만족해야 하기 때문에 IN연산자 사용
SELECT CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('국', '김치', '식용유',' 과자'))
ORDER BY 2 DESC;
`WHERE (CATEGORY, PRICE) IN ( ~~ )`
► (카테고리, 가격) 두 개 값이 동시에 만족해야 하기 때문에 `IN`연산자를 사용했다.
카테고리와 최대가격을 구하여 비교를 통해 이 값에 해당하는 행을 출력한다.
2. WITH 절을 활용한 방법
WITH TEMP AS(
SELECT CATEGORY, MAX(PRICE) AS MAX_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('과자', '국', '김치', '식용유')
)
SELECT T.CATEGORY, T.MAX_PRICE, F.PRODUCT_NAME
FROM FOOD_PRODUCT F
INNER JOIN TEMP T
ON F.CATEGORY = T.CATEGORY AND F.PRICE = T.MAX_PRICE
ORDER BY 2 DESC;
`ON F.CATEGORY = T.CATEGORY AND F.PRICE = T.MAX_PRICE`
►조회할 카테고리와 가격이, 최대가격을 갖는 카테고리와 해당 가격으로 일치하도록 조인한다.
✅ 핵심 정리
비교 연산자
- `=` : 단일 값과의 비교
- `IN` : 여러 행, 컬럼을 동시에 비교 → 값 리스트에 포함된 값들을 검사
🔗 References
[서브 쿼리를 활용한 풀이 참고]
https://jaehwaseo.tistory.com/30
[WITH절을 활용한 풀이 참고]
https://ittrue.tistory.com/420
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 코딩테스트 연습] GROUP BY - 카테고리 별 도서 판매량 집계하기 (0) | 2024.04.08 |
---|---|
[프로그래머스 SQL 코딩테스트 연습] String, Date - 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.04.08 |
[프로그래머스 SQL 코딩테스트 연습] Lv3. 조건에 맞는 사용자와 총 거래금액 조회하기 (MySQL) (0) | 2024.03.30 |
[프로그래머스 SQL 코딩테스트 연습] GROUP BY - 부서별 평균 연봉 조회하기 (0) | 2024.03.30 |
[프로그래머스 SQL 고득점 Kit] SELECT - 오프라인/온라인 판매 데이터 통합하기 (1) | 2024.03.29 |