https://school.programmers.co.kr/learn/courses/30/lessons/131123
오답 :
SELECT food_type, rest_id, rest_name, max(favorites)
from rest_info
group by 1
order by 4 desc
GROUP BY를 사용할 때 문제는 GROUP BY에 명시된 컬럼이 아닌 다른 컬럼들(rest_id, rest_name)이 집계 함수 없이 SELECT 절에 포함될 경우 발생합니다. 이때 어떤 rest_id와 rest_name을 선택해야 할지 명확하지 않기 때문에 원하는 결과를 얻을 수 없습니다.
즉 "GROUP BY를 사용하면 MAX(favorites) 같은 집계 함수는 제대로 작동하지만, 동일한 음식 종류 내에서 어떤 rest_id와 rest_name을 반환할지 결정되지 않는다"는 문제가 발생합니다.
정답 :
SELECT RI.FOOD_TYPE, RI.REST_ID, RI.REST_NAME, RI.FAVORITES
FROM REST_INFO RI
WHERE RI.FAVORITES = (
SELECT MAX(FAVORITES)
FROM REST_INFO
WHERE FOOD_TYPE = RI.FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC;
SELECT MAX(FAVORITES FROM REST_INFO WHERE FOOD_TYPE = RI.FOOD_TYPE는 서브쿼리입니다. 이 서브쿼리는 REST_INFO 테이블에서 각 음식 종류별(FOOD_TYPE)로 최대 즐겨찾기 수(FAVORITES)를 구합니다. 중요한 점은 이 서브쿼리에서 RI.FOOD_TYPE를 참조하고 있다는 점입니다.
RI.FOOD_TYPE: 메인 쿼리에서 RI.FOOD_TYPE는 REST_INFO 테이블의 FOOD_TYPE 컬럼을 나타냅니다. 서브쿼리에서 FOOD_TYPE = RI.FOOD_TYPE 조건은 "현재 메인 쿼리에서 선택된 FOOD_TYPE와 같은 FOOD_TYPE을 가진 레코드를 서브쿼리에서 찾는다"는 의미입니다. 즉, 메인 쿼리의 각 FOOD_TYPE에 대해 서브쿼리가 그 음식 종류의 최대 즐겨찾기 수를 반환하게 됩니다.
RI.FOOD_TYPE가 중요한 이유: 메인 쿼리와 서브쿼리가 동일한 FOOD_TYPE를 기준으로 작동하도록 해줍니다. 서브쿼리가 동일한 FOOD_TYPE을 가진 식당들 중에서 최대 FAVORITES 값을 계산하게 됩니다.
비슷한 문제:
https://school.programmers.co.kr/learn/courses/30/lessons/131116
정답 :
select fp.CATEGORY, price MAX_PRICE, fp.PRODUCT_NAME
from food_product fp
where fp.price = (
SELECT max(price)
from food_product
where CATEGORY = fp.CATEGORY
) and CATEGORY in ('과자', '국', '김치', '식용유')
order by price desc
'문제 풀이 > 프로그래머스 SQL' 카테고리의 다른 글
자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2024.10.31 |
---|---|
자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.10.29 |
조건에 맞는 사용자와 총 거래금액 조회하기 + HAVING 절 (1) | 2024.10.10 |
카테고리 별 도서 판매량 집계하기 (5) | 2024.10.02 |
자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (1) | 2024.10.01 |