[SQL] Programmers_JOIN. 상품을 구매한 회원 비율 구하기

Programmers JOIN. 상품을 구매한 회원 비율 구하는 문제를 파헤쳐보자 :)

Jan 12, 2026

1. 문제 설명

1-1. 테이블 설명

1-1-1. USER_INFO 테이블

notion image
✔️ USER_ID : 회원 ID
✔️ GENDER : 회원 성별
  • null : 공란
  • 0 : 남자
  • 1 : 여자
✔️ AGE : 회원 나이
✔️ JOINED : 회원 가입일

1-1-2. ONLINE_SALE 테이블

notion image
✔️ ONLINE_SALE_ID : 온라인 상품 판매 ID
✔️ USER_ID : 회원 ID
✔️ PRODUCT_ID : 상품 ID
✔️ SALES_AMOUNT : 판매량
✔️ SALES_DATE : 판매일
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재.

1-2. 문제 설명

2. 문제 풀이

2-1. 최종 풀이

WITH TOTAL_USERS AS ( SELECT COUNT(USER_ID) AS TOTAL_USER_COUNT FROM USER_INFO WHERE YEAR(JOINED) = 2021 ) SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, COUNT(DISTINCT OS.USER_ID) AS PURCHASED_USERS, ROUND(COUNT(DISTINCT OS.USER_ID)/TU.TOTAL_USER_COUNT, 1) AS PUCHASED_RATIO FROM USER_INFO AS UI JOIN ONLINE_SALE AS OS ON UI.USER_ID = OS.USER_ID CROSS JOIN TOTAL_USERS AS TU WHERE YEAR(UI.JOINED) = 2021 GROUP BY YEAR, MONTH ORDER BY YEAR, MONTH;

2-2. 단계별 풀이

2-2-1. 첫 번째 쿼리(테이블) 만들기

WITH TOTAL_USERS AS ( SELECT COUNT(USER_ID) AS TOTAL_USER_COUNT FROM USER_INFO WHERE YEAR(JOINED) = 2021 )
해당 코드를 실행시키면, USER_INFO 테이블의 2021년에 가입한 회원 전체 수를 반환한다.
 

2-2-2. 두 번째 쿼리 만들기

SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, COUNT(DISTINCT OS.USER_ID) AS PURCHASED_USERS, ROUND(COUNT(DISTINCT OS.USER_ID)/TU.TOTAL_USER_COUNT, 1) AS PUCHASED_RATIO FROM USER_INFO AS UI JOIN ONLINE_SALE AS OS ON UI.USER_ID = OS.USER_ID CROSS JOIN TOTAL_USERS AS TU WHERE YEAR(UI.JOINED) = 2021 GROUP BY YEAR, MONTH ORDER BY YEAR, MONTH;
해당 코드를 실행시키면, USER_INFO, ONLINE_SALE, TOTAL_USERS 테이블을 2021년에 가입한 값을 기준으로, 연/월 별로 그룹화하고 오름차순으로 정리된다.
이때 연/월은 SALES_DATE를 기반으로 각각 연도와 월을 뽑아낸다.
상품을 구매한 고유 회원수와, 상품을 구매한 회원의 비율을 출력한다.
 

2-2-3. 최종 쿼리

WITH TOTAL_USERS AS ( SELECT COUNT(USER_ID) AS TOTAL_USER_COUNT FROM USER_INFO WHERE YEAR(JOINED) = 2021 ) SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, COUNT(DISTINCT OS.USER_ID) AS PURCHASED_USERS, ROUND(COUNT(DISTINCT OS.USER_ID)/TU.TOTAL_USER_COUNT, 1) AS PUCHASED_RATIO FROM USER_INFO AS UI JOIN ONLINE_SALE AS OS ON UI.USER_ID = OS.USER_ID CROSS JOIN TOTAL_USERS AS TU WHERE YEAR(UI.JOINED) = 2021 GROUP BY YEAR, MONTH ORDER BY YEAR, MONTH;
해당 코드를 실행시키면, USER_INFO 테이블의 2021년에 가입한 회원 전체 수를 반환하는 테이블을 만든다.
USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 결과를 반환한다.