[SQL] PROGRAMMERS - 즐겨찾기가 가장 많은 식당 정보 출력 <GROUP BY, SUBQUERY>

2023. 4. 7. 16:52공부/SQL

Problem

 

다음은 식당의 정보를 담은 REST_INFO 테이블입니다.

REST_INFO

테이블에서 음식종류별로 즐겨찾기수가 가장 많은 식당의 음식 종류, ID, 식당 이름, 즐겨찾기수를 조회하는 SQL문을 작성해주세요. 이때 결과는 음식 종류를 기준으로 내림차순 정렬해주세요.

 

Solution

엄청 쉽게 풀릴 줄 알았다. 하지만 언제나 예상은 빗나가는 법.. 생각보다 오래걸렸다.

 

처음에 작성한 쿼리문은 아래와 같은데 GROUP BY 절을 사용하기 위해 집계함수를 MAX(FAVORITES)를 사용하면서 발생한 문제였다.

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC;

실행결과 :

반환된 REST들은그룹별  MAX(FAVORITES)를 가지는 식당들이 아닌, 그룹별 REST_ID이 낮은 식당들이였다. GROUP BY 구문이 실행되면서 HAVING FAVORITES = MAX(FAVORITES)라는  조건을 추가해 줬어야 했는데 그게 없어서 발생한 문제가 같았다. 일단 그루핑을 하고 그 뒤에 SELECT 문이 실행되니까.. MAX(FAVORITES)는 아무런 소용이 없는것 같음. 그래서 아래와 같이 작성해봤는데..

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
HAVING FAVORITES = MAX(FAVORITES)
ORDER BY FOOD_TYPE DESC;

오류가 발생했다. 

더보기

실행결과 

SQL 실행 중 오류가 발생하였습니다.
Unknown column 'FAVORITES' in 'having clause'

 

서브 쿼리를 사용해야 할 것 같음..

 

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN (
    SELECT FOOD_TYPE, MAX(FAVORITES)
    FROM REST_INFO
    GROUP BY FOOD_TYPE
) 
ORDER BY FOOD_TYPE DESC;

실행 결과

FOOD_TYPE 으로 그룹핑 되어있는 그룹들 중에서 FAVORITES가 최대값 MAX(FAVORITES)인 ROW를 만족하는 결과만을 SELECT 절에서 출력할 것이다. 요걸 ORDER BY FOOD_TYPE DESC로 정렬하는 방법.

 

이 해결방법 말고 ROWNUM () OVER() 을 사용하거나 RANK() OVER()을 사용해서 해결할 수도 잇는데 일단 기초를 더 쌓은 다음에 사용해 보겠습니다.