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

AI Scientist를 목표로!·2023년 1월 14일
0

프로그래머스 문제


테이블 구조

  • 테이블명: USER_INFO
    • USER_ID : 유저ID
    • GENDER 성별
    • AGE : 나이
    • JOINED : 가입일

  • 테이블명 : ONLINE_SAKE
    • ONLINE_SALE_ID : 온라인 상품 판매ID
    • USER_ID : 회원ID
    • PRODUCT_ID : 상품ID
    • SALES_AMOUNT : 판매량
    • SALES_DATE : 판매일

문제

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


문제 분석

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

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

  3. 년, 월 별로 출력하는 SQL문을 작성

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

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


해결 방법

  • 년, 월 별로 출력
SELECT YEAR(sales_date) AS YEAR, 
       MONTH(sales_date) AS MONTH,
  • 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수
SELECT COUNT(*)
FROM user_info
WHERE YEAR(joined) = 2021
  • 상품을 구매한 회원의 비율을 소수점 두번째에서 반올림
    • 2021년에 가입한 전체 회원 수를 구하기 위해 서브 쿼리를 활용
ROUND(COUNT(DISTINCT(os.user_id)) / (SELECT COUNT(*)
                                     FROM user_info
                                     WHERE YEAR(joined) = 2021),1)
  • 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬
ORDER BY YEAR(sales_date) ASC, MONTH(sales_date) ASC

최종 코드

SELECT YEAR(sales_date) AS YEAR, 
       MONTH(sales_date) AS MONTH,  
       COUNT(DISTINCT(os.user_id)) AS PUCHASED_USERS, 
       ROUND(COUNT(DISTINCT(os.user_id)) / (SELECT COUNT(*)
                                            FROM user_info
                                            WHERE YEAR(joined) = 2021),1) AS PUCHASED_RATIO
FROM online_sale AS os
INNER JOIN user_info AS ui ON ui.user_id = os.user_id
WHERE YEAR(joined) = 2021
GROUP BY 1,2
ORDER BY 1 ASC, 2 ASC
profile
딥러닝 지식의 백지에서 깜지까지

0개의 댓글