해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.

해당 글에서는 WITH AS, JOIN, 서브쿼리를 이용하여 푸는 문제로 초보자가 하기에는 보통 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
해당 문제를 확인하시면 문제를 보았을 때 그렇게 어렵지 않고 문제에 조건대로 쿼리를 짜주시면 됩니다.
하지만, 그래도 저희가 확인해야 할 내용이 있습니다.
첫 번째로 리뷰를 가장 많이 작성한 회원을 찾아내기 위해 모든 회원들의 리뷰 개수를 찾아야 합니다.
두 번째로 회원마다의 리뷰 개수 중 가장 많이 작성한 개수를 알아야 합니다.
그래서 저는 WITH AS를 통해 위의 첫 번째 두 번째를 위한 컬럼 값들을 따로 테이블로 만들어 주었습니다.
그리고 만든 두 테이블을 활용하여 문제의 조건에 맞는 답을 얻었습니다.
(아마도 제가 한 방법보다 더 간결하고 단순하게 푼 답도 있을테지만 그래도 이해하기 쉬운 코드로 작성 해보았습니다.)
1. 모든 회원의 리뷰 개수 확인하기
WITH CTE AS (select a.MEMBER_NAME
, count(*) as review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
group by a.MEMBER_NAME)

해당 코드는 매우 쉬우므로 설명 생략하겠습니다.
2. 회원 리뷰 수와 기존의 테이블과 합치기
CTE2 AS (select a.MEMBER_NAME,
b.REVIEW_TEXT,
b.REVIEW_DATE,
c.review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
JOIN
CTE c ON a.MEMBER_NAME = c.MEMBER_NAME)

위의 이미지와 같이 저희는 CTE2의 테이블을 이용하여 정답을 도출하기 위해서 문제 조건에서 원하는 컬럼을 미리 가져와주었습니다. 그리고 JOIN을 통해 회원마다 리뷰 수를 묶어 하나의 테이블에 위치하도록 해주었습니다.
그럼 이제 저희는 review_cnt에서 제일 높은 수의 있는 행만 존재하도록 만들면 됩니다. 그러기 위해서는 최대값을 알아내야 합니다.
3. 최대값 알아내기
select MAX(review_cnt) as max_cnt
from CTE2
즉, CTE2 테이블에서 MAX()를 사용하여 review_cnt의 최댓값을 알아내면 됩니다.
그리고 해당 테이블을 CTE2와 JOIN을 하면 리뷰 수가 가장 많은 유저들이 나오게 되는 것입니다.
4. LEFT JOIN 후 NULL값 활용하기
WITH CTE AS (select a.MEMBER_NAME
, count(*) as review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
group by a.MEMBER_NAME),
CTE2 AS (select a.MEMBER_NAME,
b.REVIEW_TEXT,
b.REVIEW_DATE,
c.review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
JOIN
CTE c ON a.MEMBER_NAME = c.MEMBER_NAME)
SELECT MEMBER_NAME
, REVIEW_TEXT
, DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d')
FROM CTE2 a
LEFT JOIN
(select MAX(review_cnt) as max_cnt
from CTE2) b ON a.review_cnt = b.max_cnt
WHERE max_cnt is NOT NULL
ORDER BY REVIEW_DATE, REVIEW_TEXT
이제 마지막으로 2번에서 구한 CTE2와 3번에서 구한 쿼리를 review_cnt와 max_cnt를 기준으로 LEFT JOIN을 해주게 되면 CTE2의 테이블의 모든 컬럼값들이 출력이 될 것입니다.
이 때 review_cnt와 max_cnt가 같지 않는 행은 max_cnt 컬럼 값 NULL값이 찍히게 될 것입니다. 이를 활용하여 저희는 NULL이 아닌 값들만 필요하므로 IS NOT NULL을 활용해주면 됩니다.
이제 조건에 맞게 정렬까지 해주시면 해당 코드는 정답이 됩니다.
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.

해당 글에서는 WITH AS, JOIN, 서브쿼리를 이용하여 푸는 문제로 초보자가 하기에는 보통 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
MEMBER_PROFILE와 REST_REVIEW 테이블에서 리뷰를 가장 많이 작성한 회원의 리뷰들을 조회하는 SQL문을 작성해주세요. 회원 이름, 리뷰 텍스트, 리뷰 작성일이 출력되도록 작성해주시고, 결과는 리뷰 작성일을 기준으로 오름차순, 리뷰 작성일이 같다면 리뷰 텍스트를 기준으로 오름차순 정렬해주세요.
해당 문제를 확인하시면 문제를 보았을 때 그렇게 어렵지 않고 문제에 조건대로 쿼리를 짜주시면 됩니다.
하지만, 그래도 저희가 확인해야 할 내용이 있습니다.
첫 번째로 리뷰를 가장 많이 작성한 회원을 찾아내기 위해 모든 회원들의 리뷰 개수를 찾아야 합니다.
두 번째로 회원마다의 리뷰 개수 중 가장 많이 작성한 개수를 알아야 합니다.
그래서 저는 WITH AS를 통해 위의 첫 번째 두 번째를 위한 컬럼 값들을 따로 테이블로 만들어 주었습니다.
그리고 만든 두 테이블을 활용하여 문제의 조건에 맞는 답을 얻었습니다.
(아마도 제가 한 방법보다 더 간결하고 단순하게 푼 답도 있을테지만 그래도 이해하기 쉬운 코드로 작성 해보았습니다.)
1. 모든 회원의 리뷰 개수 확인하기
WITH CTE AS (select a.MEMBER_NAME
, count(*) as review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
group by a.MEMBER_NAME)

해당 코드는 매우 쉬우므로 설명 생략하겠습니다.
2. 회원 리뷰 수와 기존의 테이블과 합치기
CTE2 AS (select a.MEMBER_NAME,
b.REVIEW_TEXT,
b.REVIEW_DATE,
c.review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
JOIN
CTE c ON a.MEMBER_NAME = c.MEMBER_NAME)

위의 이미지와 같이 저희는 CTE2의 테이블을 이용하여 정답을 도출하기 위해서 문제 조건에서 원하는 컬럼을 미리 가져와주었습니다. 그리고 JOIN을 통해 회원마다 리뷰 수를 묶어 하나의 테이블에 위치하도록 해주었습니다.
그럼 이제 저희는 review_cnt에서 제일 높은 수의 있는 행만 존재하도록 만들면 됩니다. 그러기 위해서는 최대값을 알아내야 합니다.
3. 최대값 알아내기
select MAX(review_cnt) as max_cnt
from CTE2
즉, CTE2 테이블에서 MAX()를 사용하여 review_cnt의 최댓값을 알아내면 됩니다.
그리고 해당 테이블을 CTE2와 JOIN을 하면 리뷰 수가 가장 많은 유저들이 나오게 되는 것입니다.
4. LEFT JOIN 후 NULL값 활용하기
WITH CTE AS (select a.MEMBER_NAME
, count(*) as review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
group by a.MEMBER_NAME),
CTE2 AS (select a.MEMBER_NAME,
b.REVIEW_TEXT,
b.REVIEW_DATE,
c.review_cnt
from MEMBER_PROFILE a
JOIN
REST_REVIEW b ON a.MEMBER_ID = b.MEMBER_ID
JOIN
CTE c ON a.MEMBER_NAME = c.MEMBER_NAME)
SELECT MEMBER_NAME
, REVIEW_TEXT
, DATE_FORMAT(REVIEW_DATE, '%Y-%m-%d')
FROM CTE2 a
LEFT JOIN
(select MAX(review_cnt) as max_cnt
from CTE2) b ON a.review_cnt = b.max_cnt
WHERE max_cnt is NOT NULL
ORDER BY REVIEW_DATE, REVIEW_TEXT
이제 마지막으로 2번에서 구한 CTE2와 3번에서 구한 쿼리를 review_cnt와 max_cnt를 기준으로 LEFT JOIN을 해주게 되면 CTE2의 테이블의 모든 컬럼값들이 출력이 될 것입니다.
이 때 review_cnt와 max_cnt가 같지 않는 행은 max_cnt 컬럼 값 NULL값이 찍히게 될 것입니다. 이를 활용하여 저희는 NULL이 아닌 값들만 필요하므로 IS NOT NULL을 활용해주면 됩니다.
이제 조건에 맞게 정렬까지 해주시면 해당 코드는 정답이 됩니다.
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.