포스트

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

https://school.programmers.co.kr/learn/courses/30/lessons/131534

문제 문제

  • 문제 풀이
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
SELECT A.YEAR, A.MONTH, A.PURCHASED_USERS, ROUND(A.PURCHASED_USERS / B.CNT, 1) AS "PURCHASED_RATIO"
FROM (
     SELECT EXTRACT(YEAR FROM SALES_DATE) AS "YEAR", 
            EXTRACT(MONTH FROM O.SALES_DATE) AS "MONTH", 
            COUNT(DISTINCT O.USER_ID) AS "PURCHASED_USERS"
     FROM ONLINE_SALE O
     JOIN USER_INFO U
     ON O.USER_ID = U.USER_ID
     WHERE TO_CHAR(U.JOINED, 'YYYY') = '2021'
     GROUP BY EXTRACT(YEAR FROM O.SALES_DATE), EXTRACT(MONTH FROM O.SALES_DATE)
    ) A, 
    (    
    SELECT COUNT(USER_ID) AS "CNT"
    FROM USER_INFO U
    WHERE TO_CHAR(JOINED, 'YYYY') = '2021'
    ) B
ORDER BY 1, 2;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
WITH USER_2021 AS (
    SELECT USER_ID, GENDER, AGE, JOINED
    FROM USER_INFO
    WHERE EXTRACT(YEAR FROM JOINED) = 2021
)

SELECT EXTRACT(YEAR FROM O.SALES_DATE) AS YEAR,
       EXTRACT(MONTH FROM O.SALES_DATE) AS MONTH,
       COUNT(DISTINCT O.USER_ID) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT O.USER_ID) * 1.0 / B.CNT, 1) AS PURCHASED_RATIO
FROM ONLINE_SALE O
JOIN USER_2021 U
ON O.USER_ID = U.USER_ID
CROSS JOIN (
    SELECT COUNT(USER_ID) AS CNT
    FROM USER_2021
) B
GROUP BY EXTRACT(YEAR FROM O.SALES_DATE), EXTRACT(MONTH FROM O.SALES_DATE), B.CNT
ORDER BY 1, 2;
  1. WITH 절을 사용하여 2021년 가입 회원 정보를 먼저 필터링하고, 이를 이용하여 ONLINE_SALE 테이블과 조인한다.
  2. CROSS JOIN을 사용하여 모든 결과 행에 대한 B.CNT를 계산하고, 마지막으로 ROUND 함수를 사용하여 비율을 계산한다.


  • CROSS JOIN
    • 두 테이블 간의 데카르트 곱(데카르트 곱은 두 집합 사이의 모든 가능한 조합을 생성하는 것)을 만드는 데 사용되는 조인 유형 중 하나이다. 즉, 첫 번째 테이블의 각 행을 두 번째 테이블의 모든 행과 결합한다.
    • 일반적으로 두 테이블 간의 관계가 없을 때 사용되며, 가능한 모든 조합을 얻고자 할 때 유용하다. 하지만 큰 테이블에서는 결과가 매우 크고 성능에 부담을 줄 수 있으므로 사용 시 주의가 필요하다.
    • 위에서의 쿼리에서는 CROSS JOIN을 사용하여 모든 결과 행에 대해 B.CNT 값을 얻기 위해 사용되었다. 이 경우 B.CNT 값은 USER_2021 테이블의 행 수가 된다.


  • 실행 결과

실행 결과

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.