코드문제풀이

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

Jerry_JH 2025. 9. 25. 16:16
728x90
반응형

문제 공유: https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr

 

[문제설명]

다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 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 조합에 대해서는 하나의 판매 데이터만 존재합니다.

 

[문제]

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

 


풀이 설명

JOIN을 하여 문제에 맞게 2021년도 회원만 추출이 되도록 하였고, 

년, 월 별로 추출이 될 수 있도록 GROUP BY를 사용했다. 

 

해당 문제에서 가장 힘들었던 점은, 전체 2021 회원 수를 가지고 와야 하는데, GROUP BY를 사용하면 전체 2021 회원수가 년, 월로 쪼개진다는 것이 문제였다. 그래서 사용한 방법이 INNER JOIN을 사용하는데 ON절을 사용하지 않게 하여 전체 2021 회원수의 개수를 컬럼으로 추가를 하였다.  

ON이 없는 JOIN은, 특별한 조건 없이 두 테이블의 모든 행을 서로 매칭하는 CROSS JOIN처럼 처리됩니다

 

전체 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)/CNT,1) AS PUCHASED_RATIO
FROM USER_INFO UI 
INNER JOIN ONLINE_SALE OS
ON UI.USER_ID = OS.USER_ID 
INNER JOIN (SELECT COUNT(1) AS cnt FROM USER_INFO WHERE YEAR(JOINED)='2021') UI2
WHERE YEAR(UI.JOINED) = '2021'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH

프로그래머스의 LV4 문제를 14문제 정도 풀다 보니, 이제는 어느 정도 익혔는지 처음으로 LV5 문제를 풀이했다.

앞으로 ORACLE 보다는 MYSQL 쿼리를 사용할 일이 많을 것 같아서 MYSQL로 문제를 풀이하였고, 프로그래머스의 정답률은 46%로 LV5치고는 많이 쉬운 편인 것 같다. 

728x90
반응형