본문 바로가기
4.2 프로그래머스 & 코테문제/SQL 풀이

[Oracle/프로그래머스 LV.5]상품을 구매한 회원 비율 구하기

by Dohi._. 2024. 7. 27.
728x90

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

 

프로그래머스

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

programmers.co.kr

 

문제설명

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

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

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

 

문제

USER_INFO 테이블과 ONLINE_SALE 테이블에서

2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와

상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을

년, 월 별로 출력하는 SQL문을 작성해주세요.

상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고,

전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

 

풀이 GIT

해당문제를 접근할때 주의할점은

월은 01 02식으로 출력하는 것이아닌 1 2 3 으로 출력하기 때문에 숫자로 변경하여줬습니다.

 

1. 2021년에 가입한 사람 분류

2. 구매 년,월 기준으로 그룹

3. 중복제거후 구매회원수 구하기

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

5. 년 월 오름차순

SELECT       TO_CHAR(o.SALES_DATE,'YYYY') AS year 
           , TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM')) AS month 
           , COUNT(DISTINCT o.user_id) as puchased_users                       -- (3) 중복제거후 구매회원수 구하기
           , ROUND(COUNT(DISTINCT o.user_id)/(SELECT count(user_id)
                                                FROM user_info 
                                               WHERE TO_CHAR(joined,'YYYY')  = '2021'),1) as puchased_ratio
                                                                               -- (4) 상품을 구매한 회원의 비율구하기
  FROM       ONLINE_SALE o , (SELECT user_id 
                                FROM user_info 
                               WHERE TO_CHAR(joined,'YYYY')  = '2021') u       --(1) 2021년에 가입한 사람 분류
 
 WHERE    u.user_id = o.user_id
 GROUP BY TO_CHAR(o.SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM'))  --(2) 구매 년,월 기준으로 그룹
 ORDER BY year, month                                                          --(5) 년 월 오름차순
;

 

--with문 적용 240730 ADD
WITH user_2021 as  (SELECT user_id 
                      FROM user_info 
                     WHERE TO_CHAR(joined,'YYYY')  = '2021')
SELECT       TO_CHAR(o.SALES_DATE,'YYYY') AS year 
           , TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM')) AS month 
           , COUNT(DISTINCT o.user_id) as puchased_users
           , ROUND(COUNT(DISTINCT o.user_id)/(SELECT count(*) FROM user_2021),1) as puchased_ratio
    
  FROM    ONLINE_SALE o , user_2021 u 
 WHERE    u.user_id = o.user_id
 GROUP BY TO_CHAR(o.SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM')) 
 ORDER BY year, month
;

 

GROUP BY는 SELECT보다 실행순서가 빠르기 때문에 SELECT의 별칭이 되지않고

ORDER BY는 SELECT보다 실행순서가 느리기 때문에 SELECT의 별칭이 됩니다

728x90

댓글