상품을 구매한 회원 비율 구하기
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;
WITH
절을 사용하여 2021년 가입 회원 정보를 먼저 필터링하고, 이를 이용하여ONLINE_SALE
테이블과 조인한다.CROSS JOIN
을 사용하여 모든 결과 행에 대한B.CNT
를 계산하고, 마지막으로ROUND
함수를 사용하여 비율을 계산한다.
CROSS JOIN
- 두 테이블 간의 데카르트 곱(데카르트 곱은 두 집합 사이의 모든 가능한 조합을 생성하는 것)을 만드는 데 사용되는 조인 유형 중 하나이다. 즉, 첫 번째 테이블의 각 행을 두 번째 테이블의 모든 행과 결합한다.
- 일반적으로 두 테이블 간의 관계가 없을 때 사용되며, 가능한 모든 조합을 얻고자 할 때 유용하다. 하지만 큰 테이블에서는 결과가 매우 크고 성능에 부담을 줄 수 있으므로 사용 시 주의가 필요하다.
- 위에서의 쿼리에서는
CROSS JOIN
을 사용하여 모든 결과 행에 대해B.CNT
값을 얻기 위해 사용되었다. 이 경우B.CNT
값은USER_2021
테이블의 행 수가 된다.
- 실행 결과
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.