본문 바로가기

SQL

[SQL 문제풀이] 상품을 구매한 회원 비율 구하기-프로그래머스

문제링크

 

USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

 

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

 

프로그래머스

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

programmers.co.kr

 

풀이

1. 가장 먼저 USER_INFO 테이블에서 2021년에 가입한 회원 전체 수를 구하는 쿼리를 작성해봤다. 

2. USER_INFO 테이블과 ONLINE_SALE 테이블을 JOIN 해서 2021년에 가입한 회원수 조건으로 년도,월별,사용자 아이디 GROUP BY 기준으로 조회를 했다. 

3. 년도,월별 기준으로 사용자아이디를 카운트하고 전체 회원수를 구하는 SELECT 문을 서브쿼리로 작성하여 컬럼에 붙였다

4. 월별 구매한 회원 카운트에 전체 회원수를 나누고 ROUND를 써서 소수 둘째자리에서 반올림하였다.

5. 년을 기준 오름차순 , 월 기준 오름차순으로 ORDER BY 했다.

 

쿼리

SELECT
    YY AS YEAR,
    TO_NUMBER(MM) AS MONTH,
    CNT AS PUCHASED_USERS,
    ROUND(CNT/CC,1) AS PUCHASED_RATIO
FROM
(
    SELECT 
    YY,
    MM,
    COUNT(USER_ID) AS CNT,
    (
        SELECT
        SUM(COUNT(USER_ID))
        FROM
        USER_INFO 
        WHERE TO_CHAR(JOINED,'YYYY') = '2021'
        GROUP BY USER_ID
    ) AS CC
    FROM (
        SELECT
            TO_CHAR(SALES_DATE,'YYYY') AS YY
            , TO_CHAR(SALES_DATE,'MM') AS MM
            , B.USER_ID
        FROM
            USER_INFO A
            ,ONLINE_SALE B
        WHERE
            A.USER_ID = B.USER_ID 
            AND TO_CHAR(A.JOINED,'YYYY') = '2021'
        GROUP BY TO_CHAR(SALES_DATE,'YYYY') , TO_CHAR(SALES_DATE,'MM') , B.USER_ID 
    ) C
    GROUP BY YY , MM 
)  ORDER BY YY ASC , MM ASC   ;