본문 바로가기

SQL/프로그래머스

[SQL] 상품을 구매한 회원 비율 구하기(프로그래머스/Oracle)

안녕하세요!

 

이번 포스팅은 프로그래머스 코딩테스트 연습에 있는 "상품을 구매한 회원 비율 구하기" 문제를 OracleDB로 풀어보려고 합니다!

 

(모든 문제는 Oracle로 풀이하겠습니다.)

 

1. 문제 링크 : https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

2. 문제

USER_INFO 테이블

NAME TYPE NULLABLE INFO
USER_ID INTEGER FALSE 회원 ID
GENDER TINYINT(1) TRUE 성별
AGE INTEGER TRUE 나이
JOINED DATE FALSE 가입일

ONLINE_SALE 테이블

NAME TYPE NULLABLE INFO
ONLINE_SALE_ID INTEGER FALSE 온라인 상품 판매 ID
USER_ID INTEGER FALSE 회원 ID
PRODUCT_ID INTEGER FALSE 상품 ID
SALES_AMOUNT INTEGER FALSE 판매량
SALES_DATE DATE FALSE 판매일
[문제] USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

 

3. 제출 쿼리 및 설명

SELECT 
    EXTRACT(YEAR FROM O.SALES_DATE) AS YEAR,
    EXTRACT(MONTH FROM O.SALES_DATE) AS MONTH,
    COUNT(DISTINCT O.USER_ID) AS PUCHASED_USERS,
    ROUND(COUNT(DISTINCT O.USER_ID) / (SELECT COUNT(USER_ID)
                                         FROM USER_INFO
                                         WHERE EXTRACT(YEAR FROM JOINED) = 2021),1) AS PUCHASED_RATIO
FROM USER_INFO U, ONLINE_SALE O
WHERE U.USER_ID = O.USER_ID
AND EXTRACT(YEAR FROM U.JOINED) = 2021
GROUP BY 
    EXTRACT(YEAR FROM O.SALES_DATE),
    EXTRACT(MONTH FROM O.SALES_DATE)
ORDER BY 
    YEAR,
    MONTH