본문 바로가기

코딩테스트/SQL - 프로그래머스

SQL 고득점 kit(JOIN) - 상품을 구매한 회원 비율 구하기

 

프로그래머스 문제

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문으로 만들었다면 좀 더 간단한 쿼리가 되었을 것 같다.