알고리즘/PROGRAMMERS

상품을 구매한 회원 비율 구하기(DB)

현대타운301 2024. 3. 28. 03:01

 


 

문제 설명

 

 

 

입출력 예시

 

 

요약

2021년 가입자 중에서 구매를 한 회원수와 그 비율을 구매한 년, 월 별로 출력

 


 

풀이

 

접근 방식

1. 유저 아이디와 가입년도를 기준으로 조인

  → 두 테이블의 USER_ID가 같고 가입년도가 21년인 조건으로 WHERE절 작성

 

2. 년, 월 별로 그룹화

  → SALES_DATE의 YEAR과 MONTH를 기준으로 GROUP BY절 작성

 

3. 중복 조회 데이터 제외

  → 구매 횟수가 아닌 구매 여부를 따져야 하므로 DISTINCT로 중복된 USER_ID 제외

 

4. 비율 구하기

→ 분모로 사용할 2021년 가입자 수를 서브쿼리를 통해 구하고, ROUND를 통해 소수점 두 번째 짜리까지만 반올림

 

5. 년, 월 별로 정렬

  → ORDER BY 1, 2를 통해 년, 월 순으로 정렬(디폴트는 오름차순)

 


 

SQL문 리뷰

 

SELECT  TO_CHAR(O.SALES_DATE, 'YYYY') YEAR,	-- 구매한 날짜의 년도 추출
        TO_NUMBER(TO_CHAR(O.SALES_DATE, 'MM')) MONTH,	-- 구매한 날짜의 월 추출(01~09월의 앞에 오는 0을 없애기 위해 NUMBER로 변환)
        COUNT(DISTINCT O.USER_ID) PURCHASED_USERS,	-- COUNT로 구매한 회원 수 구하기(중복은 DISTINCT로 제거)
        ROUND(COUNT(DISTINCT O.USER_ID)/ (SELECT COUNT(*) FROM USER_INFO WHERE TO_CHAR(JOINED, 'YYYY') = 2021), 1) PURCHASED_RATIO	-- SUBQUERY로 2021년 전체 가입자 구해서 나누기
FROM ONLINE_SALE O, USER_INFO U	-- 테이블 조인을 위한 별칭
WHERE O.USER_ID = U.USER_ID AND TO_CHAR(U.JOINED, 'YYYY') = 2021	-- USER_ID와 가입년도를 기준으로 JOIN
GROUP BY TO_CHAR(O.SALES_DATE, 'YYYY'), TO_CHAR(O.SALES_DATE, 'MM')	-- 구매 년, 월 기준으로 그룹화
ORDER BY 1, 2;	-- 구매 년, 월 별로 정렬