https://school.programmers.co.kr/learn/courses/30/lessons/131118#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
테이블 정보
1.REST_INFO( as ri )
REST ID |
REST NAME |
FOOD TYPE |
VIEWS | FAVORITES | PARKING LOT |
ADDRESS | TEL |
00028 | 대우부대찌개 | 한식 | 52310 | 10 | N | 경기도 용인시 처인구 남사읍 처인성로 309 | 031-235-1235 |
00039 | 광주식당 | 한식 | 23001 | 20 | N | 경기도 부천시 산업로8번길 60 | 031-235-6423 |
00035 | 삼촌식당 | 일식 | 532123 | 80 | N | 서울특별시 강서구 가로공원로76가길 | 02-135-1266 |
2. REST_REVIEW( as rr )
REVIEW_ID | REST_ID | MEMBER_ID | REVIEW_SCORE | REVIEW_TEXT | REVIEW_DATE |
R000000065 | 00028 | soobin97@naver.com | 5 | 부찌 국물에서 샤브샤브 맛이나고 깔끔 | 2022-04-12 |
R000000066 | 00039 | yelin1130@gmail.com | 5 | 김치찌개 최곱니다. | 2022-02-12 |
R000000067 | 00028 | yelin1130@gmail.com | 5 | 햄이 많아서 좋아요 | 2022-02-22 |
R000000068 | 00035 | ksyi0316@gmail.com | 5 | 숙성회가 끝내줍니다. | 2022-02-15 |
R000000069 | 00035 | yoonsy95@naver.com | 4 | 비린내가 전혀없어요. | 2022-04-16 |
컬럼 정보
식당ID(rest_id), 식당이름(rest_name), 음식종류(food_type), 즐겨찾기수(favorites), 주소(address), 리뷰점수 (review_score)
문제 설명
REST_INFO와 REST_REVIEW 테이블에서 서울에 위치한 식당들의 식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회하는 SQL문을 작성해주세요. 이때 리뷰 평균점수는 소수점 세 번째 자리에서 반올림 해주시고 결과는 평균점수를 기준으로 내림차순 정렬해주시고, 평균점수가 같다면 즐겨찾기수를 기준으로 내림차순 정렬해주세요.
풀이 과정
서울에 위치한
where address like '서울%' -- "서울%" 로 하면 에러가 나기 때문에 주의
식당 ID, 식당 이름, 음식 종류, 즐겨찾기수, 주소, 리뷰 평균 점수를 조회
리뷰점수(review_score)은 rest_review테이블에, 이를 제외한 나머지 컬럼은 rest_info 에 있기 때문에 두 테이블을 join해서 사용해서 컬럼을 select해야한다.
join의 기준은 두 테이블에 공통적으로 존재하는 rest_id를 통해 가능
리뷰의 평균 점수를 조회해야하기 때문에 특정 기준으로 테이블을 그룹화해야하는데 해당 조건은 mySql 과 Oracle에서 각각 다르기 때문에 유의해서 사용하자
리뷰 평균점수는 소수점 세 번째 자리에서 반올림
avg() 와 round() 내장함수를 사용하여 처리 가능
평균점수, 즐겨찾기수로 내림차순
정렬은 order by를 사용해 각 컬럼의 위치로도 가능, 컬럼의 이름으로도 가능하기때문에 편한대로 사용
내림차순은 뒤에 desc를 붙여주면 가능
정답
MySQL
select ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address, round(avg(review_score),2) as score
from rest_info ri
join rest_review rr
on ri.rest_id = rr.rest_id
where ri.address like '서울%'
group by ri.rest_id -- ri.rest_name, ri.address 로도 그룹화 가능(중복이 없는 값들)
order by 6 desc, 4 desc
Oracle
select ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address, round(avg(review_score),2) as score
from rest_info ri
join
rest_review rr
on ri.rest_id = rr.rest_id
where ri.address like '서울%'
group by ri.rest_id, ri.rest_name, ri.food_type, ri.favorites, ri.address
-- 그룹을 하고자 하는 컬럼명을 select와 group by 절에 둘 다 명시해줘야 함, 집계함수(위에선 avg)는 따로 명시할 필요가 없음
order by 6 desc, 4 desc
oracle에서 group by 를 쓸 때 주의할 점은 select하는 컬럼명을 select절과 group by 절에 모두 명시해줘야 한다는 점이다.
다만 집계함수(sum, count, avg 등의) 는 group by에 명시하지 않아도 됨
'SQL' 카테고리의 다른 글
[SQL] 오라클(oracle), MySQL 날짜 년월 추출, 날짜 가공 (0) | 2024.02.01 |
---|---|
[SQL/GROUP BY] 즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2022.12.15 |
[SQL] 정렬 후 원하는 개수만큼 조회(상위 n개) (0) | 2022.12.08 |