부제:
상품을 구매한 회원 비율 구하기, 레벨 5
1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/131534
2. 정답 코드:
SELECT
year(sales_date) as year,
month(sales_date) as month,
count(distinct u.user_id) as purchased_users,
round(count(distinct u.user_id) /
(select count(*) from user_info where joined like "2021%"),1) as purchased_ratio
from USER_INFO as u
join ONLINE_SALE as o
on u.user_id = o.user_id
where u.joined like "2021%"
group by year, month
order by year asc, month asc;
3. 오류 상황:
SELECT
year(sales_date) as year,
month(sales_date) as month,
count(distinct u.user_id) as purchased_users,
round(o.user_id / u.user_id , 1) as purchased_ratio
from USER_INFO as u
join ONLINE_SALE as o
on u.user_id = o.user_id
where u.joined like "2021%" and o.sales_date like "2021%"
order by year asc, month asc;
=> o.user_id / u.user_id는 행 단위의 계산
=> "2021년에 구매한 상품"으로 한정 X
=> GROUP BY 절 누락
4. 시도 방법:
=> SELECT 절 안에서 서브쿼리를 사용
=> WHERE o.sales_date like "2021%" 조건을 삭제
=> GROUP BY 절 추가
5. 최종 문제 해결 방법:
=> 현재 쿼리의 o.user_id / u.user_id는 행 단위의 계산이라 우리가 원하는 비율이 나오지 않는다. 2021년에 가입한 전체 회원 수를 하나의 상수로 미리 구해 나눠야 하기 때문에 SELECT 절 안에서 서브쿼리를 사용해야 한다.
=> 가입은 2021년에 했더라도, 구매는 2022년에 할 수 있다. WHERE o.sales_date like "2021%" 조건을 삭제해야 모든 연도/월별 판매 현황을 볼 수 있다.
=> COUNT 같은 집계 함수를 사용할 때 YEAR, MONTH 별로 결과를 보고 싶다면 반드시 GROUP BY를 써주어야 한다. GROUP BY가 빠져 있으면 결과가 한 줄만 나올 수 있다.
'SQL 알고리즘 코드카타' 카테고리의 다른 글
| SQL 알고리즘 코드카타 28일차(1) 26.01.26(월) (0) | 2026.01.26 |
|---|---|
| SQL 알고리즘 코드카타 27일차(1) 26.01.25(일) (0) | 2026.01.25 |
| SQL 알고리즘 코드카타 25일차(1) 26.01.23(금) (0) | 2026.01.23 |
| SQL 알고리즘 코드카타 24일차(1) 26.01.22(목) (0) | 2026.01.22 |
| SQL 알고리즘 코드카타 23일차(3) 26.01.21(수) (0) | 2026.01.21 |