GROUP BY 유의점
-- GROUP BY 로 그룹으로 묶은 컬럼별 최대값은 찾을수 있지만 GROUP BY만으로는 최대값에 맞는 다른 컬럼(이름,ID)는 조회할수 없다,
-- 다만 WHERE에서 IN을 사용해 최대값과 동일한 값을 가진 데이터를 조회하면 ID,이름 등 최대값에 맞는 ROW을 맞게 추출할수 있다.
문제
FOOD_PRODUCT 테이블에서 식품분류별로 가격이 제일 비싼 식품의 분류, 가격, 이름을 조회하는 SQL문을 작성해주세요. 이때 식품분류가 '과자', '국', '김치', '식용유'인 경우만 출력시켜 주시고 결과는 식품 가격을 기준으로 내림차순 정렬해주세요.
테이블 소개

테이블 예제

시도 코드
- 문제점
문제가 카테고리별 최대값을 조회하는 것인데 최대값을 구했으나 최대값에 맞는 상품 ID와 상품명이 일치하지 않았다
SELECT A.PRODUCT_ID, A.CATEGORY, A.PRODUCT_NAME, RANK() OVER(ORDER BY TOP_PRICE DESC) AS C ,PRICE
FROM FOOD_PRODUCT A
JOIN (SELECT PRODUCT_ID, CATEGORY, PRODUCT_NAME, MAX(PRICE) AS TOP_PRICE
FROM FOOD_PRODUCT
GROUP BY CATEGORY) B
ON A.PRODUCT_ID = B.PRODUCT_ID
SELECT CATEGORY , MAX(PRICE) AS MAX_PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
GROUP BY CATEGORY
HAVING CATEGORY IN ('과자', '국', '김치', '식용유','면')
ORDER BY MAX_PRICE DESC
- 시도한 코드들이 틀린 이유
카테고리가 면인 식품의 최고 금액인 상품은 4950원에 P0003 , 맛있는짜장 이지만
시도한 코드로 조회한 테이블에서는 가격은 4950이 맞지만 맛있는 라면이라고 되었있다
가격과 상품 명이 동일하지 않다는 것을 알수 있다,

시도한 코드로 조회한 테이블

정답 코드
SELECT CATEGORY,PRICE AS MAX_RICE,PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE PRICE IN (SELECT MAX(PRICE) FROM FOOD_PRODUCT GROUP BY CATEGORY)
AND CATEGORY IN ('과자', '국', '김치', '식용유')
ORDER BY MAX_RICE DESC
GROUP BY 유의점
그룹별 최대수만 조회한다면 일반 그룹바이만 사용하지만
두가지 컬럼 외에 다른 ID, 이름 등 최대수에 일치하는 컬럼들을 조회하기 위해서는
WHERE 서브쿼리를 이용해야한다.
'SQL > 프로그래머스' 카테고리의 다른 글
| SQL 프로그래머스6일차_8 GROUP BY , GROUP_CONCAT(), WITH 활용 (0) | 2023.01.04 |
|---|---|
| SQL 프로그래머스 6일차_7 WHERE 서브쿼리 (0) | 2023.01.03 |
| SQL 프로그래머스 6일차_3 JOIN , GROUP BY , DATE_FORMAT,컬럼별 합계 (0) | 2023.01.03 |
| SQL 프로그래머스_6일차_2 ROUND(AVG()), JOIN , GROUP BY , 정규화(REGEXP) (0) | 2023.01.03 |
| SQL 프로그래머스_6일차_4 IN, GROUP BY 최대 수 찾기 (0) | 2023.01.03 |