본문 바로가기

SQL/프로그래머스 SQL 고득점 kit

SQL 고득점 kit / SELECT / 서울에 위치한 식당 목록 출력하기(GROUP BY)

728x90

📚문제

출처 : 프로그래머스(https://school.programmers.co.kr/learn/courses/30/lessons/131118)

 

📝풀이

SELECT I.REST_ID
     , I.REST_NAME
     , I.FOOD_TYPE
     , I.FAVORITES
     , I.ADDRESS
     , ROUND(AVG(R.REVIEW_SCORE),2) AS SCORE
FROM REST_INFO I
INNER JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
WHERE I.ADDRESS LIKE '서울%'
GROUP BY I.REST_ID
ORDER BY SCORE DESC, I.FAVORITES DESC

일단 풀어서 정답이 나오긴 했는데

이해가 가지 않는 점이 2가지 있다

 

1. GROUP BY 절에 REST_ID로만 작성해주고 나머지 컬럼은 넣지 않았는데 SELECT 문에서 잘 돌아간다

물론 한 개의 REST_ID에 대해서 NAME과 TYPE은 다 동일하게 들어가겠지만

그룹화함수(AVG,SUM...)도 아닌데 GROUP BY 절에 넣지 않아도 되는건지..? 

 

구글링 해서 여러 글을 읽어봤는데

우선 그룹화는 GROUP BY 절에 작성한 I.REST_ID에 대해서만 되는 것 같다

이 문제에서는 REST_ID에 대해 나머지 컬럼이(NAME, TYPE,...)등이

1개의 REST_ID에 대해 1개의 값만 들어가는 1:1 관계이기 때문에

그룹화가 잘 되서 정답으로 처리 되는 것 같다

헷갈리니까 되도록이면 그룹화되는 컬럼은 SELECT문에 넣어주자

 

(+GROUP BY 관련 해서 참고한 글)

https://kimsyoung.tistory.com/entry/GROUP-BY%E4%B8%8B-%EC%98%A4%EB%A5%98%EB%AC%B8-%ED%95%B4%EA%B2%B0%ED%95%98%EA%B8%B0

 

 

2. GROUP BY 를 해주지 않고 그냥 코드를 실행하면 값이 행 1개만 나온다 

그리고 GROUP BY를 해주면 행이 4개가 나온다 

어떻게 이렇게 나오는지 이해가 잘 안된다

 

행을 한 개씩 실행해보다가

ROUND(AVG(R.REVIEW_SCORE),2) 부분에서 알게됐다

 

GROUP BY 해주지 않고 

AVG 함수를 적용하게되면

모든 행의 리뷰점수를 합치게 되서 1행으로 나오는것이다

(20행에 대해서 리뷰점수를 나누니까 값도 똑같이 나옴)

그렇기 때문에

GROUP BY를 해준 후에

AVG 함수를 적용하게 되면

ID가 총 4개이므로 4개 식당에 대해서 각각 평균 점수가 나오는 것

 

 

 


+ SELECT절 서브쿼리를 활용한 풀이

SELECT DISTINCT I.REST_ID
     , I.REST_NAME
     , I.FOOD_TYPE
     , I.FAVORITES
     , I.ADDRESS
     , ROUND((SELECT AVG(REVIEW_SCORE) AS SCORE
        FROM REST_REVIEW R2
        WHERE R2.REST_ID = I.REST_ID
        GROUP BY REST_ID),2) AS SCORE
FROM REST_INFO I
JOIN REST_REVIEW R ON I.REST_ID = R.REST_ID
WHERE LEFT(ADDRESS,2) = '서울'
ORDER BY SCORE DESC, I.FAVORITES DESC
728x90