출처
문제
REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
문제에 대한 해석
-- 조건: 서울에 위치한 식당들
-- 조회: 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수
-- 출력: 리뷰 평균점수는 소수점 세 번째 자리에서 반올림
-- 정렬: 평균점수 내림차순 , 즐겨찾기 내림차순
풀이(MYSQL)
with temp as (
select i.rest_id, i.rest_name, i.food_type, i.FAVORITES,i.address,avg(r.review_score) avg_review
from rest_info i join rest_review r on i.rest_id = r.rest_id
where i.address like '서울%'
group by i.rest_id
)
select rest_id, rest_name, food_type, FAVORITES, address, round(avg_review,2) avg_review
from temp
order by avg_review desc, FAVORITES desc
작동순서
💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환
- WITH 절: rest_info 와 rest_review 테이블을 rest_id로 조인하여 address가 like '서울%인 것만 필터링 후 rest_id별로 그룸화 한다. rest_id에는 한개의 rest_name, food_type, FAVORITES이 있고 복수의 review가 있어서 avg집계는 eview에만 적용하여 조회한다
- FROM 절: with절의 임시테이블에서
- SELECT 절: rest_id, rest_name, food_type, FAVORITES, address와 평균집계된 avg_review를 반올림한 2째자리 까지 나타낸다
- ORDER BY 절: avg_review,FAVORITES 내림차순으로 정렬
다른사람 풀이
SELECT A.REST_ID, A.REST_NAME, A.FOOD_TYPE, A.FAVORITES, A.ADDRESS, ROUND(AVG(B.REVIEW_SCORE), 2) SCORE
FROM REST_INFO A
JOIN REST_REVIEW B
ON A.REST_ID = B.REST_ID
WHERE A.ADDRESS LIKE '서울%'
GROUP BY A.REST_ID
ORDER BY SCORE DESC,
A.FAVORITES DESC
배운점
- 집계함수와 반올림함수를 동시에 사용 가능하다
- 원칙적으로 조회하는 컬럼 중 집계하지 않는 컬럼의 의 수와 그룹화 하는 컬럼의 수는 동일하지만 rest_id의 경우 고유id당 컬럼의 단 한개씩의 데이터가 존재하므로 그룹함수를 적용해도 조회되는 데이터는 동일하다
'문제풀이 > SQL(My sql)' 카테고리의 다른 글
[문제풀이] 헤비 유저가 소유한 장소 (0) | 2024.01.26 |
---|---|
[문제풀이] 자동차 평균 대여 기간 구하기 (1) | 2024.01.26 |
[문제풀이] 자동차 대여 기록에서 장기/단기 대여 구분하기 (1) | 2024.01.25 |
[문제풀이] 취소되지 않은 진료 예약 조회하기 (1) | 2024.01.24 |
[문제풀이] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 (0) | 2024.01.24 |