코딩테스트/SQL - 프로그래머스
SQL 고득점 kit(JOIN) - 상품을 구매한 회원 비율 구하기
K_Wien
2024. 3. 22. 15:57
프로그래머스 문제
https://school.programmers.co.kr/learn/courses/30/lessons/131534#qna
풀이
https://school.programmers.co.kr/questions/74261
-- 풀이 쿼리
-- 2021년 가입 회원 중 구매기록이 있는 회원 수와
-- 2021년에 가입한 전체 회원 중 해당 회원들(=2021년 가입 회원 구매기록이 있는 회원들)의 비율을
-- 년, 월별로 출력.
-- 비율은 소수점 첫째자리까지만
-- 전체 결과는 연 기준 오름차순, 월 기준 오름차순 정렬
WITH N AS (
SELECT COUNT(DISTINCT USER_ID) AS N_CUSTOMERS
FROM USER_INFO
WHERE YEAR(JOINED) = '2021'
)
SELECT YEAR(O.SALES_DATE) AS YEAR
, MONTH(O.SALES_DATE) AS MONTH
, COUNT(DISTINCT CASE WHEN YEAR(U.JOINED) = '2021' THEN O.USER_ID ELSE NULL END) AS PUCHASED_USERS
, ROUND(COUNT(DISTINCT CASE WHEN YEAR(U.JOINED) = '2021' THEN O.USER_ID ELSE NULL END)
/ (SELECT N_CUSTOMERS FROM N), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE O
LEFT JOIN USER_INFO U
ON O.USER_ID = U.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
쿼리를 풀이해보면 이렇다.
1. WITH문 : 가입 연도가 2021년인 회원 수 셈(물론 WITH문으로 안 빼도 되긴 했음)
2. COUNT(DISTINCT CASE WHEN ...) : 가입 연도가 2021년인 회원 중 구매기록이 있는 회원 수 셈
3. ROUND( ... ... ... ) : 문제에서 요구하는 비율 계산
그 외에는 정렬 조건을 맞춰주면 된다.
뭔가 더 다른 효율적인 방법이 있을까?
아예 WITH문을 2021년에 가입한 회원들의 정보를 담은 CTE문으로 만들었다면 좀 더 간단한 쿼리가 되었을 것 같다.