Data/SQL

[프로그래머스 SQL 고득점 kit] 상품을 구매한 회원 비율 구하기

J._.haza 2025. 3. 21. 00:03

문제 바로가기 >> https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

 

 

그냥 평범한 테이블이라 딱히 어려운 문제는 아닌듯.

근데 결과 데이터 보고 코호트 구하는 테이블인건가? 싶었다. 커머스 도메인이면 실무상 유용 할 듯

 

왜냐면 이커머스 도메인에서 신규 유저 리텐션 정의할 때 많은 회사들이 "재구매"를 기준으로 리텐션을 정의하는데, 

아래 같이 21년 신규 유저이면서 22년 월별 리텐션(=재구매율)을 보고 싶다면 이런식으로 데이터를 뽑은 다음 Pivot 해서 코호트 분석 해보면 신규 유저를 잘....어느 시점에 재구매 유도를 해야하는지 대강 감이 오기 때문이다.

 

 

내가 쓴 답 : 

with base as (
    select count(distinct user_id) as user_cnt
    from user_info
    WHERE year(joined) = 2021
)
SELECT 
    year(sales_date) as YEAR
    , month(sales_date) as MONTH
    , count(distinct t2.user_id) as PURCHASED_USERS
    , round(count(distinct t2.user_id) / (select user_cnt from base), 1) as purchased_ratio
FROM USER_INFO t1
LEFT JOIN ONLINE_SALE t2 ON t1.USER_ID = t2.USER_ID
WHERE year(t1.joined) = 2021 -- 2021년에 가입한 사람 발라내기
GROUP BY 1,2
having count(distinct t2.user_id) > 0 -- 보기싫은 null값 지우기
order by 1,2

 

 

풀이

- 개인적으로 select 절에 한 줄이 길어지는게 싫어서 21년 가입한 유저수는 CTE로 뺐다.

- 그냥 대충... sales_date에 있는 널값이 그대로 노출되어서 having으로 치웠다.