문제 설명
다음은 식당의 정보를 담은 REST_INFO 테이블입니다. REST_INFO 테이블은 다음과 같으며 REST_ID, REST_NAME, FOOD_TYPE, VIEWS, FAVORITES, PARKING_LOT, ADDRESS, TEL은 식당 ID, 식당 이름, 음식 종류, 조회수, 즐겨찾기수, 주차장 유무, 주소, 전화번호를 의미합니다.
정답
SELECT F2.FOOD_TYPE, F2.REST_ID, F2.REST_NAME, F2.FAVORITES
FROM (
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
) AS F1 INNER JOIN REST_INFO AS F2 ON F1.FOOD_TYPE = F2.FOOD_TYPE AND F1.FAVORITES = F2.FAVORITES
ORDER BY FOOD_TYPE DESC
실행 결과
문제 풀이
FOOD-TYPE은 동일한데 REST-ID나 REST-NAME이 다른 케이스가 존재해서 MAX(FAVORITES)을 구하려고 하면 오류가 난다.
기본적으로 MAX(),MIN(),SUM() 같은 집계 함수를 사용할 경우
SELECT에 집계에 필요한 컬럼만 존재하거나 그게 아니라면
최대값을 계산하기 위해 비교해야하는 값들로 별도의 서브 쿼리를 작성해야함
그래서 서브쿼리를 별도로 작성했다.
1. SELECT FOOD_TYPE과 MAX(FAVORITES)만 조회한다.
2. FROM REST_INFO REST_INFO테이블에서
3. GROUP BY FOOD_TYPE FOOD TYPE별로 확인
즉, REST_INFO 테이블에서 FOOD TYPE별로 가장 FAVORITES이 많은 열을 조회한다.
그리고 기존의 REST_INFO 와 조인을 하는데,
INNER JOIN을 사용하여 서브쿼리에서 가져온 값과 기존의 테이블의 값에서 공통적으로 있는(교집합) 데이터만 합친다.
서브쿼리를 F1으로 REST_INFO를 F1으로 할 때 각 테이블에 공통적으로 존재하는 열을 엮어줌
=> FOOD_TYPE, FAVORITES
-------------------------------------------------------------------------
SELECT F2.FOOD_TYPE, F2.REST_ID, F2.REST_NAME, F2.FAVORITES
FROM (
SELECT FOOD_TYPE, MAX(FAVORITES) AS FAVORITES
FROM REST_INFO
GROUP BY FOOD_TYPE
) AS F1 INNER JOIN REST_INFO AS F2 ON F1.FOOD_TYPE = F2.FOOD_TYPE AND F1.FAVORITES = F2.FAVORITES
ORDER BY FOOD_TYPE DESC -> FOOD_TYPE 내림차순으로 정렬
----------------------------------------------------------------------------------------
https://school.programmers.co.kr/questions/71228
'DB > Programmers SQL 문제 풀이' 카테고리의 다른 글
[programmers] SQL(MySQL) 중성화 여부 파악하기(CASE THEN) (0) | 2024.02.02 |
---|---|
[programmers] SQL(MySQL) 고양이와 개는 몇 마리 있을까(GROUP BY) (0) | 2024.02.02 |
[programmers] SQL(MySQL) 중복 제거하기 (0) | 2024.02.02 |
[programmers] SQL(MySQL) <LIMIT> 상위 n개 레코드 (0) | 2024.01.31 |
[programmers] SQL(MySQL) <UNION> 오프라인/온라인 판매 데이터 통합하기 (0) | 2024.01.31 |