SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 26일차(1) 26.01.24(토)

nom_de_plume 2026. 1. 24. 16:13

부제:

상품을 구매한 회원 비율 구하기, 레벨 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가 빠져 있으면 결과가 한 줄만 나올 수 있다.