본문 바로가기
SQL

상품을 구매한 회원 비율 구하기 - 플머

by hoshi03 2024. 12. 4.

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

• 풀이

 

2021년도에 가입한 유저 ID, 유저수를 USER_INFO에서 빼온다

둘이 동시에 빼오지는 못해서 각각 서브쿼리로 빼오고 

 -- 2021 가입한 유저 ID
    (   SELECT USER_ID
        FROM USER_INFO  
        WHERE TO_CHAR(JOINED,'YYYY') LIKE '2021%') U
-- 2021 가입한 유저 수
    (
        SELECT COUNT(USER_ID) CNT
        FROM USER_INFO  
        WHERE TO_CHAR(JOINED,'YYYY') LIKE '2021%'

 

구매기록 테이블과 조인해서 가져오기 위해서 유저 아이디를 조인, 유저 수는 계속 필요하니 크로스 조인하고 월과 년을 빼오기 위해서 EXTRACT를 사용했다

 

해당 방식으로 컬럼에서월,년 데이터를 빼온다

EXTRACT(YEAR FROM SALES_DATE)
EXTRACT(MONTH FROM SALES_DATE)

 

문제 조건이 년가 월을 각각 조건으로 해서 그룹을 해줘야 하고, 크로스 조인한 2021년도 회원수도 그룹하는데 사용한다 

GROUP BY EXTRACT(YEAR FROM SALES_DATE),  EXTRACT(MONTH FROM SALES_DATE), C.CNT

 

SELECT  EXTRACT(YEAR FROM SALES_DATE) YEAR,  
        EXTRACT(MONTH FROM SALES_DATE) MONTH, 
        COUNT(DISTINCT O.USER_ID) PURCHASED_USERS,  
        ROUND(COUNT(DISTINCT O.USER_ID) / C.CNT,1) PUCHASED_RATIO
FROM 
    ONLINE_SALE O 
JOIN
    -- 2021 가입한 유저 ID
    (   SELECT USER_ID
        FROM USER_INFO  
        WHERE TO_CHAR(JOINED,'YYYY') LIKE '2021%') U
ON U.USER_ID = O.USER_ID
CROSS JOIN
    -- 2021 가입한 유저 수
    (
        SELECT COUNT(USER_ID) CNT
        FROM USER_INFO  
        WHERE TO_CHAR(JOINED,'YYYY') LIKE '2021%'
    ) C
GROUP BY EXTRACT(YEAR FROM SALES_DATE),  EXTRACT(MONTH FROM SALES_DATE), C.CNT
ORDER BY YEAR, MONTH