Programmers Lv5
- 상품을 구매한 회원 비율 구하기
👉 문제 바로가기(Programmers)
-- 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력
SELECT
YEAR(t2.SALES_DATE) as YEAR,
MONTH(t2.SALES_DATE) as MONTH,
COUNT(DISTINCT t2.USER_ID) as PURCHASED_USERS,
ROUND(COUNT(DISTINCT t2.USER_ID) /
(SELECT COUNT(DISTINCT USER_ID) FROM USER_INFO WHERE JOINED LIKE '2021-%'),1) as PURCHASED_RATIO
FROM
USER_INFO t1,
ONLINE_SALE t2
WHERE
t1.USER_ID = t2.USER_ID AND
t1.JOINED LIKE '2021-%'
GROUP BY
YEAR(t2.SALES_DATE),
MONTH(t2.SALES_DATE)
ORDER BY
YEAR,
MONTH
[문제 상황]
- 본 쿼리 SELECT절에서 비율을 계산해야 하는데, 분모인 2021년 가입한 총 회원수는 본 쿼리에서 바로 구할 수 없다.
- 본 쿼리 COUNT 함수에 *을 넣어 전체 행 개수를 세니까 원하는 값이 출력되지 않았다.
[해결]
- SELECT 절에 2021년 가입한 총 회원수를 구하는 서브쿼리를 사용하여 비율을 계산한다.
- USER_INFO, ONLINE_SALE 테이블을 USER_ID로 Inner Join하였기 때문에, ONLINE_SALE 테이블의 영향으로 USER_ID에 중복값이 생겨서 COUNT함수의 *를 넣으면 원하는 값이 출력되지 않았다. (=구매수로 집계됨)
- 따라서 USER_ID앞에 DISTINCT를 작성하여 중복값을 삭제한 후 COUNT를 해주면 원하는 값, 즉 구매수가 아닌 회원수가 도출된다.
[회고]
- 파이썬으로 이런 로직의 코드를 작성할 때는 변수를 활용할 것 같다.
- SQL에서도 변수 지정이 가능하나, 프로시저 단계(테이블 생성, 호출, 수정, 삭제)에서 가능하다.
- 서브쿼리를 통해 하나의 값을 출력하여 변수처럼 활용할 수 있다.
'DA Study > TIL' 카테고리의 다른 글
[TIL] 집계함수 중복처리(DISTINCT) #SQL #SQLite #solvesql (0) | 2025.02.13 |
---|---|
[TIL] 날짜 구하기(datetime, date) #SQL #SQLite #solvesql (0) | 2025.02.12 |
[TIL] 조건절에서 서브쿼리 활용하기 # MySQL # SQL (4) | 2025.02.01 |
[TIL] UNION 테이블 병합 시 각 테이블 별 정렬하기 # MySQL # SQL (0) | 2025.01.31 |
[TIL] subplot으로 두 개의 그래프 한 figure에 그리기 # python # 부트캠프 (1) | 2025.01.23 |