해당 문제는 Programmers에서 사용한 문제이며 모든 테이블의 자료와 출처는 Programmers임을 밝힙니다.
해당 글에서는 GROUP BY, SUB QUERY, JOIN을 이용하여 푸는 문제로 초보자가 하기에는 보통 정도의 난이도를 가지고 있는 것 같습니다.
해당 문제 원본을 확인 하시려면 해당 사이트를 들어가시면 될 것 같습니다.
시작하겠습니다.
USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
해당 문제에서 중요한 것은 구매한 회원의 비율 계산을 잘 구성하면 됩니다.
저는 해당 문제에서 SELECT절에 서브쿼리를 활용하여 풀었습니다.(이 문제를 풀면서 SELECT절에도 서브쿼리를 사용할 수 있다는 것을 알게되었습니다...ㅎㅎ)
그리고 이 문제에서 년, 월 별로 출력하라 되었는데 이 것은 상품을 판매한 년, 월별로 묶는 것입니다.
단순하게 생각해서 푼 결과 매우 빠르고 제가 보기엔 가독성이 좋은 쿼리로 짤 수 있었습니다.
1. 문제 조건에 맞는 컬럼들을 찾기 위해 JOIN, WHERE, GROUP BY 사용하기
SELECT *
FROM USER_INFO a
JOIN
ONLINE_SALE b ON a.USER_ID = b.USER_ID
WHERE YEAR(a.JOINED) = 2021
GROUP BY YEAR(b.SALES_DATE), MONTH(b.SALES_DATE)
해당 문제의 조건에서 2021년에 가입한 회원들에서 고르는 문제이기에 WHERE절을 사용해주었습니다.
상품을 판매한 년 월 별로 확인 하기 위해 YEAR(), MONTH()를 이용하고 GROUP BY를 하여 묶어주었습니다.
위의 이미지와 같이 조건에 맞게 날짜가 묶인 것을 확인 할 수 있습니다.
2. 구매한 회원의 비율을 출력하기 위한 쿼리 확인하기
SELECT COUNT(DISTINCT a.USER_ID) AS PURCHASED_USERS
FROM USER_INFO a
JOIN
ONLINE_SALE b ON a.USER_ID = b.USER_ID
WHERE YEAR(a.JOINED) = 2021
GROUP BY YEAR(b.SALES_DATE), MONTH(b.SALES_DATE)
2021년에 가입한 회원 중 상품을 구매한 회원 수를 구하는 코드입니다.
해당 코드에서는 그저 COUNT와 DISTINCT만 사용한 이유는 저희는 이미 GROUP BY를 사용하여 구매한 날짜를 묶어 주었습니다.
즉, 2021년에 가입하였고 상품을 구매한 회원을 년 월별로 묶은 뒤 해당 년 월의 구매한 유저 수를 COUNT한 것입니다.
SELECT COUNT(DISTINCT USER_ID)
FROM USER_INFO
WHERE YEAR(JOINED) = 2021
해당 코드는 2021년에 가입한 전체 회원 수를 구하는 코드입니다.
여기서는 GROUP BY를 사용할 필요 없이 바로 WHERE절을 통해 2021년에 가입한 회원들만 있을 수 있게 한 후 유저 수를 COUNT하면 2021년에 가입한 전체 유저 수를 구할 수 있습니다.
3. 위에서 구한 값들을 이용하여 구매한 회원 비율 구하기
SELECT YEAR(b.SALES_DATE) AS YEAR
, MONTH(b.SALES_DATE) AS MONTH
, COUNT(DISTINCT a.USER_ID) AS PURCHASED_USERS
, ROUND(COUNT(DISTINCT a.USER_ID)
/ (SELECT COUNT(DISTINCT USER_ID) FROM USER_INFO WHERE YEAR(JOINED) = 2021), 1) AS PUCHASED_RATIO
FROM USER_INFO a
JOIN
ONLINE_SALE b ON a.USER_ID = b.USER_ID
WHERE YEAR(a.JOINED) = 2021
GROUP BY YEAR(b.SALES_DATE), MONTH(b.SALES_DATE)
ORDER BY YEAR, MONTH
위의 코드와 같이 2021년에 가입한 전체 유저 수를 서브쿼리를 통해 구해 준 뒤 나눠 주면 문제에서 요구한 구매 회원 비율을 구할 수 있습니다.
그리고 구한 값을 나눠주고 ROUND를 사용하여 두번째 자리에서 반올림을 하도록 만들어주면 됩니다.
마지막으로 조건에 맞게 컬럼을 넣어주고 정렬을 해주시면 해당 코드는 정답이 됩니다.
이상으로 Programmers 문제 풀이를 마치도록 하겠습니다.
'Data Analyst > SQL' 카테고리의 다른 글
[SQL] Programmers 문제 풀기(5월 식품들의 총매출 조회하기) (3) | 2024.11.13 |
---|---|
[SQL] Programmers 문제 풀기(5월 식품들의 총매출 조회하기) (0) | 2024.11.12 |
[SQL] Programmers 문제 풀기(자동차 대여 기록에서 장기/단기 대여 구분하기) (1) | 2024.11.10 |
[SQL] Programmers 문제 풀기(특정 기간동안 대여 가능한 자동차들의 대여비용 구하기) (0) | 2024.11.07 |
[SQL] Programmers 문제 풀기(주문량이 많은 아이스크림들 조회하기) (0) | 2024.11.06 |