데이터베이스
[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.