문제풀이/SQL(My sql)
[문제풀이] 서울에 위치한 식당 목록 출력하기
kime2
2024. 1. 25. 10:18
출처
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
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당 컬럼의 단 한개씩의 데이터가 존재하므로 그룹함수를 적용해도 조회되는 데이터는 동일하다