반응형

@notepad_jj2

츄르사려고 코딩하는집사입니다.


1. [프로그래머스/SQL] 그룹별 조건에 맞는 식당 목록 출력하기 오라클(Oracle)

 

2. 문제 출처

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

 

프로그래머스

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

programmers.co.kr

 

3. 문제

다음은 식당의 정보를 담은 REST_INFO테이블과 식당의 리뷰 정보를 담은 REST_REVIEW 테이블입니다. MEMBER_PROFILE 테이블은 다음과 같으며 MEMBER_ID, MEMBER_NAME, TLNO, GENDER, DATE_OF_BIRTH는 회원 ID, 회원 이름, 회원 연락처, 성별, 생년월일을 의미합니다.

Column nameTypeNullable

MEMBER_ID VARCHAR(100) FALSE
MEMBER_NAME VARCHAR(50) FALSE
TLNO VARCHAR(50) TRUE
GENDER VARCHAR(1) TRUE
DATE_OF_BIRTH DATE TRUE

REST_REVIEW 테이블은 다음과 같으며 REVIEW_ID, REST_ID, MEMBER_ID, REVIEW_SCORE, REVIEW_TEXT,REVIEW_DATE는 각각 리뷰 ID, 식당 ID, 회원 ID, 점수, 리뷰 텍스트, 리뷰 작성일을 의미합니다.

Column nameTypeNullable

REVIEW_ID VARCHAR(10) FALSE
REST_ID VARCHAR(10) TRUE
MEMBER_ID VARCHAR(100) TRUE
REVIEW_SCORE NUMBER TRUE
REVIEW_TEXT VARCHAR(1000) TRUE
REVIEW_DATE DATE TRUE

문제

MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순 정렬해주세요.

 

예시

MEMBER_PROFILE 테이블이 다음과 같고

MEMBER_IDMEMBER_NAMETLNOGENDERDATE_OF_BIRTH

jiho92@naver.com 이지호 01076432111 W 1992-02-12
jiyoon22@hotmail.com 김지윤 01032324117 W 1992-02-22
jihoon93@hanmail.net 김지훈 01023258688 M 1993-02-23
seoyeons@naver.com 박서연 01076482209 W 1993-03-16
yelin1130@gmail.com 조예린 01017626711 W 1990-11-30

REST_REVIEW 테이블이 다음과 같을 때

REVIEW_IDREST_IDMEMBER_IDREVIEW_SCOREREVIEW_TEXTREVIEW_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

SQL을 실행하면 다음과 같이 출력되어야 합니다.

MEMBER_NAMEREVIEW_TEXTREVIEW_DATE

조예린 김치찌개 최곱니다. 2022-02-12
조예린 햄이 많아서 좋아요 2022-02-22

 

4. 풀이

- MEMBER_PROFILE(MP) 테이블과 REST_REVIEW(RR) 테이블을 MEMBER_ID 기준으로 INNER JOIN을 한다. 우리는 MEMBER_ID를 알아야 MEMBER_NAME을 알기 때문에, MEMBER_ID를 RR 테이블에서 찾아야 한다. 찾아야 하는 기준은 GROUP BY를 했을 때, 가장 많은 값을 가지고 있는 MEMBER_ID를 뽑아내야 하기 때문에, GROUP BY ~ HAVING 절을 통해 뽑아내서 출력하면 된다.

 

5. 소스 코드

    SELECT MP.MEMBER_NAME                        AS MEMBER_NAME
         , RR.REVIEW_TEXT                        AS REVIEW_TEXT
         , TO_CHAR(RR.REVIEW_DATE, 'YYYY-MM-DD') AS REVIEW_DATE
      FROM MEMBER_PROFILE MP
INNER JOIN REST_REVIEW RR ON MP.MEMBER_ID = RR.MEMBER_ID
     WHERE RR.MEMBER_ID IN (
                            SELECT MEMBER_ID
                              FROM REST_REVIEW
                          GROUP BY MEMBER_ID
                            HAVING COUNT(*) = ( SELECT MAX(COUNT(*))
                                                  FROM REST_REVIEW
                                              GROUP BY MEMBER_ID
                                              )
                            )
  ORDER BY RR.REVIEW_DATE

반응형
  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기