코딩테스트
[프로그래머스] 상품을 구매한 회원 비율 구하기 SQL
_maddy
2024. 6. 14. 00:24
https://school.programmers.co.kr/learn/courses/30/lessons/131534
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr

전체 코드
WITH JOIN_2021 AS(
SELECT USER_ID,JOINED
FROM USER_INFO
WHERE YEAR(JOINED)=2021
),
JOIN_2021_COUNT AS(
SELECT COUNT(*) AS TOTAL
FROM USER_INFO
WHERE YEAR(JOINED)=2021
),
SALE AS(
SELECT
YEAR(SALE.SALES_DATE) AS YEAR,
MONTH(SALE.SALES_DATE) AS MONTH,
COUNT(DISTINCT(SALE.USER_ID)) AS CNT
FROM ONLINE_SALE AS SALE
JOIN JOIN_2021 AS JO
ON SALE.USER_ID=JO.USER_ID
GROUP BY YEAR(SALE.SALES_DATE),MONTH(SALE.SALES_DATE)
)
SELECT
S.YEAR,
S.MONTH,
S.CNT AS PURCHASED_USERS,
ROUND(S.CNT/J.TOTAL,1) AS PUCHASED_RATIO
FROM SALE AS S,JOIN_2021_COUNT AS J
ORDER BY S.YEAR,S.MONTH
까다로웠지만 이것도 차근차근 풀다보면 풀리는 문제... 쿼리가 중첩으로 들어가있는 걸 별로 안좋아해서 이번에도 with을 적극적으로 사용해서 풀 수 있었다. 각각 분리해서 설명해보겠다.
1. user_info에서 2021년에 가입한 회원 찾기 - join_2021, join_2021_count
WITH JOIN_2021 AS(
SELECT USER_ID,JOINED
FROM USER_INFO
WHERE YEAR(JOINED)=2021
),
JOIN_2021_COUNT AS(
SELECT COUNT(*) AS TOTAL
FROM USER_INFO
WHERE YEAR(JOINED)=2021
),
2021년에 가입한 회원을 찾는 테이블, 그다음에 2021에 가입한 회원 수를 계산하는 테이블 하나를 만들었다.
2. 2021년에 가입한 회원들이 online_sale 테이블에서 년,월별로 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수 - sale
SALE AS(
SELECT
YEAR(SALE.SALES_DATE) AS YEAR,
MONTH(SALE.SALES_DATE) AS MONTH,
COUNT(DISTINCT(SALE.USER_ID)) AS CNT
FROM ONLINE_SALE AS SALE
JOIN JOIN_2021 AS JO
ON SALE.USER_ID=JO.USER_ID
GROUP BY YEAR(SALE.SALES_DATE),MONTH(SALE.SALES_DATE)
)
여기서 미리 만들어 둔 join_2021 테이블을 sale과 조인해서 2021년에 가입한 회원들을 가져온다. 그리고 년,월별로 상품을 구매한 회원수를 구한다. 여기서 회원 수 셀 때는 중복을 제거해줘야 한다.
3. 계산
SELECT
S.YEAR,
S.MONTH,
S.CNT AS PURCHASED_USERS,
ROUND(S.CNT/J.TOTAL,1) AS PUCHASED_RATIO
FROM SALE AS S,JOIN_2021_COUNT AS J
ORDER BY S.YEAR,S.MONTH
앞전에 계산해 둔 2021년에 가입한 회원수 테이블과 sale 테이블을 조인해서 계산하면 끝.