본문 바로가기
알고리즘

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

by 홍서 2024. 4. 24.

문제

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

 

프로그래머스

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

programmers.co.kr

풀이과정

1. USER_INFO 테이블과 ONLINE_SALE 테이블을 사용한다.
2. 조건: 2021년에 가입한 전체 회원들 중
3. 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력

   3-1. 년, 월로 그룹핑한다.

   3-2. 2021년에 가입한 회원 중, 각 그룹에 구매한 이력이 있으면 카운팅한다. -> (distinct(count(user_id))

   3-3. 2021년 가입한 전체 회원 수를 구하라 -> 따로 빼는 것이 계산이 쉽다.

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

풀이

with a as(
select user_id
from user_info
where year(joined) = '2021'
), -- 2021년 가입한 전체 회원수
b as (
select year(sales_date) year, month(sales_date) month, user_id, product_id
from online_sale 
where user_id in (select * from a)
) -- 2021년에 가입한 회원들의 구매기록 테이블

/*
(년, 월)로 그룹핑해서 해당 그룹에 구매 기록이 있는 회원 수를 중복없이 카운팅 -> count(distinct(user_id))
a를 이용해 "2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수"를 구한 후 round를 이용해 소수점 두번째 자리에서 반올림한다. 
*/
select year, month, count(distinct(user_id)) purchased_users, round(count(distinct(user_id))/(select count(user_id) from a), 1) purchased_ratio
from b
group by year, month
order by 1, 2;