둘셋 개발!

[SQL] 프로그래머스 - 상품을 구매한 회원 비율 구하기 본문

데이터베이스

[SQL] 프로그래머스 - 상품을 구매한 회원 비율 구하기

23 2025. 3. 16. 19:45

문제

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

 

프로그래머스

SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


💡 해결 과정

먼저 2021년에 가입한 유저와 갯수 를 구하는 것이 먼저이다.

그래서 다음과 같은 쿼리를 사용했다.

select USER_ID, count(USER_ID)
from USER_INFO
where JOINED like '2021%'

 

쿼리를 실행 했더니 2021년 가입한 유저의 갯수는 잘 나오는데, 행이 총 1개만 출력되는 것이였다.

그래서 찾아봤더니 집계함수를 사용할 때 group by를 사용하지 않고 집계함수와 다른 컬럼을 함께 실행시키면

USER_ID는 랜덤으로 나온다는 것이였다.

 

내가 원한 결과는 

USER_ID count(USER_ID)
1 4
14 4
20 4
30 4

 

이렇식으로 2021년 가입한 user_id가 모두 나오고 총 개수도 함께 나오는 것이다.

 

이렇게 결과가 나오려면 어떻게 해야할까?

 

바로 윈도우 함수를 사용하면 된다.

(https://lightson2323.tistory.com/123 글에 윈도우 함수에 대한 설명이 나옵니다!)

 

총 행의 개수를 구할 수 있도록 다음과 같이 작성하면 된다.

select USER_ID, COUNT(USER_ID) OVER() as total_count
from USER_INFO
where JOINED like '2021%')

 

그리고 문제에서 연도, 월별에 대한 통계를 구해야 하기 때문에

이때 group by에 연도, 월을 넣고 집계함수를 사용해서 값을 추출하면 된다.

 

정답쿼리

select 
    year(s.SALES_DATE) as YEAR,
    month(s.SALES_DATE) as MONTH,
    count(distinct u.USER_ID) as PURCHASED_USERS,
    round((count(distinct u.USER_ID) / total_count), 1) as PUCHASED_RATIO
from ONLINE_SALE s
    left join (
        select USER_ID, COUNT(USER_ID) OVER() AS total_count
        from USER_INFO
        where JOINED like '2021%') u
    on s.USER_ID = u.USER_ID
group by year(s.SALES_DATE), month(s.SALES_DATE)
order by YEAR asc, MONTH asc

 

처음에 윈도우 함수가 떠오르지 않아 2021년에 가입한 사용자의 수를 따로 계산하여 변수에 저장해서 쿼리를 작성했다.

정답이였지만, 불필요한 쿼리를 한 번더 작성하게 되므로 효율적이진 않았다.ㅎㅎㅎ

 


ref.

https://godji.tistory.com/82