삽질메모장

programmers SQL Level 5 - 상품을 구매한 회원 비율 구하기 본문

DataBase/문제풀이

programmers SQL Level 5 - 상품을 구매한 회원 비율 구하기

shovel 2024. 3. 13. 00:11

 

 

프로그래머스

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

programmers.co.kr


-문제

 

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

 

1. 2021년에 가입한 전체 회원중 상품을 구매한 회원수

      1-1. USER_ID 를 카운트 하되 USER_INFO, ONLINE_SALE 조인하여 "구매한 회원"만 조회

      1-2. online_sale 에는 한 회원의 여러 구매 이력이 있으므로 DISTINCT 하여 중복제거

2. (1.의 내용/2021년에 가입 한 전체 회원수)

      2-1. 1. 과 똑같이 작성 /  "2021의 가입 한 전체 회원수 서브쿼리 작성"

      2-2. 서브쿼리 내용은 2021년 가입회원 count, 이때는 USER_INFO만 조회하므로 중복제거 불필요

      2-3. 2자리는 반올림 : round( 쿼리, 1)

3. YEAR, MONTH 단위 묶음, 정렬

 

따로 SQL 문제는 풀어본적 없어서 간만에 감각 살릴겸 풀어봤다. 프로그래머스에서 가장 높은 난이도지만 굉장히 쉬워서 leetcode 에서 번역해가며 풀어보는게 나을것 같다.

SELECT 
DATE_FORMAT(B.SALES_DATE, "%Y") as YEAR,
DATE_FORMAT(B.SALES_DATE, "%m") as month,
count(DISTINCT A.USER_ID) AS PUCHASED_USERS,
 	round((count(DISTINCT A.USER_ID) / (select count(*) from USER_INFO  where JOINED LIKE("2021%"))),  1)
 	AS PUCHASED_RATIO
from USER_INFO A 
join ONLINE_SALE B 
on (A.USER_ID = B.USER_ID)
where A.JOINED LIKE("2021%")
group by YEAR,month 
order by YEAR, month