알고리즘/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; -- 구매 년, 월 별로 정렬