코딩테스트/SQL

[프로그래머스]상품을 구매한 회원 비율 구하기 (MySQL/Lv. 5)

ONGSIM_2 2024. 4. 27. 14:38

1. 문제

1) 문제 설명

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

Column name Type Nullable
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 name Type Nullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

 

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

 

2) 문제

USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월별로 출력하는 SQL문을 작성해주세요.

 

상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

 

3) 출력 예시

YEAR MONTH PUCHASED_USERS PUCHASED_RATIO
2022 1 2 0.5
2022 2 1 0.3

 


2. 코드

SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(O.SALES_DATE, '%m') AS Month,
COUNT(DISTINCT O.USER_ID) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT O.USER_ID) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED like "2021%"),1) 
AS PUCHASED_RATIO

FROM ONLINE_SALE AS O
JOIN USER_INFO AS U
ON U.USER_ID = O.USER_ID
WHERE U.JOINED like "2021%"

GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;

 

  • SELECT에서 년, 월, 구매자 수, 구매 비율을 선택
    • DATE_FORMAT(O.SALES_DATE, '%m') : 월/연별로 날짜를 뽑아옴
    • COUNT(DISTINCT O.USER_ID) : 전체 구매자의 수를 출력. 이때, 중복되는 ID를 제거.
    • (SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED like "2021%") : 2021년 전체 가입자의 수
    • ROUND(**, 1) : 소수점 둘째 자리에서 반올림
  • JOIN으로 가입자 정보 테이블과 구매자 정보 테이블을 합침
    • ON U.USER_ID = O.USER_ID : 두 테이블이 사용자 ID를 기준으로 JOIN
    • WHERE U.JOINED like "2021%" : 이때, 2021년에 대한 정보만 포함되도록 함
  • GROUP BY YEAR, MONTH : 이 문제는 연도와 월별로 총 구매 비율과 수를 보고 싶어하므로 그룹화
  • ORDER BY YEAR, MONTH : 오름차순으로 정렬

문제 출처

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

 

프로그래머스

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

programmers.co.kr