프로그래머스; 상품을 구매한 회원의 비율 구하기

랜디 Randy·2024년 3월 1일
0

SQL 문제풀이

목록 보기
13/20

문제


문제를 직접 풀고싶으신 분은 이 링크를 클릭해주세요

정답코드


-- answer
SELECT YEAR(SALES_DATE) AS YEAR,
        MONTH(SALES_DATE) AS MONTH,
        COUNT(DISTINCT info.USER_ID) AS PUCHASED_USERS,
        ROUND(COUNT(DISTINCT info.USER_ID) / (SELECT COUNT(*)
                                             FROM USER_INFO
                                             WHERE JOINED LIKE '2021%')
             , 1) AS PUCHASED_RATIO
FROM USER_INFO AS info
JOIN ONLINE_SALE AS sale ON info.USER_ID = sale.USER_ID
WHERE JOINED LIKE '2021%'
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE)
ORDER BY YEAR, MONTH
;

LEVEL 5 문제라서 꽤나 난이도가 높습니다.

문제에서 안내하는대로 코드를 설명해보도록 하겠습니다.

1. 2021년에 가입한 전체 회원


해당 문제는 2021년에 가입한 사람들을 기준으로 문제를 풀이해나가고 있으므로

JOINED LIKE '2021%' 을 통해서 필터링했습니다.
다른 방법으로는 YEAR(JOINED) = 2021 을 사용하는 방법이 있습니다.

2. 상품을 구매한 회원의 수


수를 세는건 COUNT() 를 사용하면 쉽게 셀 수 있습니다. 다만 주의해야하는 점은 USER_ID가 중복될 수 있기 때문에 DISTINCT() 를 넣어주어야 합니다.

3. 상품을 구매한 회원의 비율


비율을 소수점 둘째자리에서 반올림하라고 했습니다. 따라서 결과적으로는 소수점 한자리까지 보여야하기 때문에, ROUND(, 1)을 사용했고,

구매한 사람의 수 / 2021년에 가입한 사람의 수

를 구해서 빈칸에 넣어줍니다.

참고

문제에서 예시 답안을 보면 상품을 구매한 회원의 수와 상품을 구매한 회원의 비율이 각각
PUCHASED_USERS, PUCHASED_RATIO로 작성되어 있습니다. 오타인 것 같기는한데, 그래도 예시에서 나오는대로 작성했습니다.

4. 년, 월별로 구분


우선 테이블의 자료를 읽어보면 날짜 컬럼의 경우 모두 DATE형식으로 구성되어 있었기 때문에 YEAR(SALES_DATE)를 사용해서 년과 월을 어렵지 않게 구분해낼 수 있었습니다.

년, 월별로 구분하여 각 월의 상품을 구매한 회원 수와 비율을 계산해야했기 때문에 GROUP BY를 사용했고,

년을 기준으로 오름차순, 같을 시 월을 기준으로 오름차순을 요구했기 때문에 ORDER BY도 사용했습니다.

참고

GROUP BY YEAR, MONTH 라고 작성해도 코드는 정상적으로 작동됩니다.
SELECT 문에서 alias로 지정해놓은 YEAR과 MONTH를 가져오기 때문입니다.

다만 이는 권장되지는 않는 방식입니다. SQL의 실행 순서를 살펴보면

FROM -> JOIN -> WHERE -> GROUP BY -> HAVING -> SELECT -> ORDER BY

이 순서로 실행되는데, 순서를 보시면

SELECT 문이 실행되기 전에 GROUP BY가 실행됩니다.
따라서 GROUP BY 문에서 SELECT문의 alias를 작성하는건 실행순서에 맞지 않는 방법이므로, 프로그램이 유연하다면 허용을 해주겠으나 기본적으로는 작동이 안될 가능성이 있는 코드 작성 방식입니다.

따라서 저는
GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE) 형식으로 작성했습니다.

결론


이렇게 Divide / Conquer 해나가니 막 어렵게 다가오진 않습니다.

다만 문제만 전체적으로 읽고 코드를 생각한다면 제대로 생각나지 않을 가능성이 있으니

천천히 문제를 읽어보는 습관을 들여야겠습니다.

profile
데이터는 계단, 직관은 다리

0개의 댓글