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()을 사용해서 해결할 수도 잇는데 일단 기초를 더 쌓은 다음에 사용해 보겠습니다.
'공부 > SQL' 카테고리의 다른 글
[SQL] Programmer - 입양시각 구하기(2) <GROUP BY, SET @> (0) | 2023.04.07 |
---|---|
[SQL] Programmers - 년, 월, 성별 별 상품 구매 회원 수 구하기 <GROUP BY, INNER JOIN, COUNT> (0) | 2023.04.07 |
[SQL] Programmers - 조건에 부합하는 중고거래 댓글 조회 <INNER JOIN, WHERE, DATE_FORMAT> (0) | 2023.04.07 |
[SQL] Hackerrank - Symmetric Pairs (Not Done) (0) | 2023.04.06 |
[SQL] Hackerrank - Placements (0) | 2023.04.05 |