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

2024. 1. 13. 15:09Coding/프로그래머스-SQL

문제 링크

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

 

프로그래머스

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

programmers.co.kr

 

문제

 

코드

-- 코드를 입력하세요
SELECT YEAR, MONTH, COUNT(*) AS PURCHASED_USERS, ROUND((COUNT(*)/(SELECT COUNT(*)
     FROM USER_INFO WHERE YEAR(JOINED) = 2021)), 1) AS PURCHASED_RATIO
     FROM (
     SELECT DISTINCT YEAR(O.SALES_DATE) AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.USER_ID
     FROM ONLINE_SALE O
     JOIN USER_INFO U ON O.USER_ID = U.USER_ID AND YEAR(JOINED) = 2021) A
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;

1. ROUND() 함수가 있는 위치가 SELECT 절이라는 것에 주목한다. SELECT 절은 서브쿼리를 넣을 수 있는 위치이다. 따라서 ROUND() 함수 안에 서브쿼리를 생성해서 집어넣을 수 있다. 이때 이 서브쿼리에서는 2021년에 가입한 전체 회원수가 출력되도록 한다. 

2. FROM 절에 또 하나의 서브쿼리를 생성해준다. 생성해야 할 서브쿼리가 많아서 이 문제의 레벨이 가장 높은 것으로 추정이 된다. FROM절에서 생성된 서브쿼리에선 년, 월, 그리고 회원을 출력한다. 이때 년도는 구별이 되어야 하므로 DISTINCT를 사용한다. 

3. FROM절에 사용된 서브 쿼리 안에서 JOIN을 실시해준다. 어떤 회원이 어떤 상품을 구매했는지 연결이 되어야 하므로 INNER JOIN을 사용해주는게 상황상 맞다.