문제
문제링크
접근
- "이게 왜 틀리지? 문제 오류인가?" 인가를 정말 많이 반복하였다. 그런데 결론적으로 문제에는 오류 하나 없어서 머쓱하였다.
- (2021년에 가입한 회원 중 상품을 구매한 회원수) / (2021년에 가입한 전체 회원 수)를 최종적으로 구현해야 하는데 편의상 (분자) / (분모)로 별칭한다.
- 풀이할 때 아래 논리적 오류 큰 2가지 함정을 조심해야 한다.
- 한 사람이 같은 년, 월에 2번 이상 구매할 수 있으므로 분자에서 중복을 제거해야 한다.
- 2021년에 가입한 회원 중에 물건을 아예 구매 안한 사람도 분모에 포함되어야 한다.
- 구현 방법은 DISTINCT로 중복을 제거하고, SELECT절에서의 서브쿼리로 분모를 제대로 명시해야 한다.
풀이
SELECT YEAR, MONTH, COUNT(*) AS PUCHASED_USERS,
ROUND((COUNT(*)/ (SELECT COUNT(*)
FROM USER_INFO WHERE YEAR(JOINED) = 2021)), 1) AS PUCHASED_RATIO
FROM (
SELECT DISTINCT YEAR(S.SALES_DATE) AS YEAR, MONTH(S.SALES_DATE) AS MONTH, U.USER_ID
FROM ONLINE_SALE S
JOIN USER_INFO U ON S.USER_ID = U.USER_ID AND YEAR(JOINED) = 2021
) A
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
처음에는 2021년 전체 사람을 어떻게 구해야 하는지 몰라서 찾아왔는데,
알고보니 중복 제거도 해줬어야 하는군요...
친절한 포스팅 덕분에 잘 배워갑니다 !