프로그래머스/SQL문제

[SQL문제] 그룹별 조건에 맞는 식당 목록 출력하기

뜽배 2022. 11. 7. 20:50
728x90
반응형

문제

https://school.programmers.co.kr/learn/courses/30/lessons/131124

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

정답 

 

SELECT 
MEMBER_NAME,
REVIEW_TEXT,
TO_CHAR(REVIEW_DATE, 'YYYY-MM-DD') AS REVIEW_DATE
FROM (
    SELECT 
        A.MEMBER_NAME, 
        B.REVIEW_TEXT, 
        B.REVIEW_DATE, 
        COUNT(*) OVER(PARTITION BY B.MEMBER_ID ) AS COUNT
    FROM MEMBER_PROFILE A,  REST_REVIEW B
    WHERE A.MEMBER_ID = B.MEMBER_ID)
WHERE COUNT = (SELECT MAX(COUNT(*))
                FROM REST_REVIEW
                GROUP BY MEMBER_ID)
ORDER BY MEMBER_NAME, REVIEW_DATE, REVIEW_TEXT;

 

 

풀이

1. 조건을 파악한다.

 

1-1. REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원을 찾을 것

1-2. '1-1'의 조건을 기준으로 '회원이름, '리뷰텍스트', '리뷰 작성일' 을 조회할 것

1-3. 리뷰작성일 오름차순, 리뷰텍스트 오름차순으로 정렬할 것

 

 

2. 풀이

2-1.

SELECT 
    A.MEMBER_NAME, 
    B.REVIEW_TEXT, 
    B.REVIEW_DATE, 
    COUNT(*) OVER(PARTITION BY B.MEMBER_ID ) AS COUNT
FROM MEMBER_PROFILE A,  REST_REVIEW B
WHERE A.MEMBER_ID = B.MEMBER_ID

 리뷰를 가장 많이 작성한 회원을 찾을 때는 REST_REVIEW테이블만 있으면 찾을 수 있지만, 최종적으로 조회할 때 '회원이름'을 조회해야 하기 때문에 REST_REVIEW테이블과 MEMBER_PROFILE테이블을 조인해서 조회한다.

 

위의 SQL문에서 WHERE절은 MEMBER_PROFILE과 REST_REVIEW테이블의 조인 조건이며

COUNT(*)의 OVER절을 통해 MEMBER_ID별로 묶어 COUNT(*)를 주었다.

 

2-2.

SELECT 
MEMBER_NAME,
REVIEW_TEXT,
TO_CHAR(REVIEW_DATE, 'YYYY-MM-DD') AS REVIEW_DATE
FROM (
    SELECT 
        A.MEMBER_NAME, 
        B.REVIEW_TEXT, 
        B.REVIEW_DATE, 
        COUNT(*) OVER(PARTITION BY B.MEMBER_ID ) AS COUNT
    FROM MEMBER_PROFILE A,  REST_REVIEW B
    WHERE A.MEMBER_ID = B.MEMBER_ID)
WHERE COUNT = (SELECT MAX(COUNT(*))
                FROM REST_REVIEW
                GROUP BY MEMBER_ID)
ORDER BY MEMBER_NAME, REVIEW_DATE, REVIEW_TEXT;

그리고 위의 SQL과 같이 '2-1'에서 작성한 SQL을 한번 더 감싸서 WHERE절에 COUNT를 통해 최고값을 찾아 필터한 후 SELECT에서 조회하고자 하는 컬럼들을 작성한다.

 

2-3. 마지막으로 ORDER BY 문을 통해 문제에서 낸 조건을 충족한다.

728x90
반응형