새벽코딩

[프로그래머스] [Level 5] 상품을 구매한 회원비율 구하기 (ORACLE) 본문

알고리즘

[프로그래머스] [Level 5] 상품을 구매한 회원비율 구하기 (ORACLE)

J 코딩 2023. 2. 20. 00:36
반응형

https://school.programmers.co.kr/learn/courses/30/lessons/131534?language=oracle

프로그래머스

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

programmers.co.kr


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

 
문제 설명

다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.

Column nameTypeNullable
USER_ID INTEGER FALSE
GENDER TINYINT(1) TRUE
AGE INTEGER TRUE
JOINED DATE FALSE

GENDER 컬럼은 비어있거나 0 또는 1의 값을 가지며 0인 경우 남자를, 1인 경우는 여자를 나타냅니다.

ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

Column nameTypeNullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.


문제

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


※ SQL 소스 (상품을 구매한 회원비율 구하기)

- 코드를 입력하세요
SELECT 
      YEAR
    , MONTH
    , COUNT(DISTINCT USER_ID) AS PURCHASED_USERS
    , ROUND(COUNT(DISTINCT USER_ID) / (SELECT COUNT(*)
                        FROM USER_INFO
                        WHERE EXTRACT(YEAR FROM JOINED) = 2021
                       ), 1) AS PURCHASED_RATIO
FROM 
(
    SELECT
          EXTRACT(YEAR FROM SALES_DATE) AS YEAR
        , EXTRACT(MONTH FROM SALES_DATE) AS MONTH
        , UI.USER_ID AS USER_ID
    FROM USER_INFO UI
    INNER JOIN ONLINE_SALE OS
    ON UI.USER_ID = OS.USER_ID
    AND EXTRACT(YEAR FROM JOINED) = 2021
) RESULT
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH

※ 생각정리
1. 연도와 달을 따로 뽑아오기위해서 EXTRACT() 함수를 사용하였다.
2. 현재 유저의 총 수를 뽑기위해 전체 유저 리스트를 내부쿼리에서 가져와 DISTINCT로 중복을 제거한 후 수를 구하였다.
3. 2째자리에서 반올림하기 위해 ROUND() 함수를 사용하였고, 처음에는 TO_CHAR('실수값', 'FM9990.09')와 같이 소수점앞에 0을 붙이는 문자열 처리를 해주었지만 이렇게 하면 틀리다는 결과가 나와서 사용하지 않으니 정답을 얻을 수 있었다.

다음에는 WITH절로 내부쿼리를 빼주어 본 쿼리를 좀 간단하게 만들어볼 생각이다.

-새벽코딩-

반응형
Comments