https://school.programmers.co.kr/learn/courses/30/lessons/131532
코드설명
INNER JOIN + YEAR + MONTH + GROUP BY + DISTINCT + COUNT 를 활용합니다.
문제에서 유의해야할 점은, 아래의 COUNT(DISTINCT UI.USER_ID) 입니다.
COUNT(DISTINCT UI.USER_ID) AS USERS
이유는, USER가 같은 기간에 아이템을 여러번 구매할 수 있는데, 그렇게 되면 하나의 회원이 여러번 COUNT됩니다.
예로 들면, 2022년 1월에 "PASSIONFRUIT200"이 3번 아이템과 10번 아이템을 구매했습니다.
그러면 2022 1월 에 1명으로 처리하여야 하므로, 중복된 UI.USER_ID는 DISTINCT로 중복제거 하여 올바르게 COUNT합니다.
코드
SELECT YEAR(OS.SALES_DATE) AS YEAR, MONTH(OS.SALES_DATE) AS MONTH, UI.GENDER AS GENDER, COUNT(DISTINCT UI.USER_ID) AS USERS
FROM USER_INFO AS UI
INNER JOIN ONLINE_SALE AS OS
ON UI.USER_ID = OS.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY YEAR(OS.SALES_DATE), MONTH(OS.SALES_DATE), UI.GENDER
ORDER BY YEAR(OS.SALES_DATE) ASC, MONTH(OS.SALES_DATE) ASC, UI.GENDER ASC
ORACLE
-- 코드를 입력하세요
SELECT TO_CHAR(OS.SALES_DATE, 'YYYY') AS YEAR , TO_NUMBER(TO_CHAR(OS.SALES_DATE, 'MM')) AS MONTH, UI.GENDER AS GENDER, COUNT(DISTINCT UI.USER_ID) AS USERS
FROM USER_INFO UI
INNER JOIN ONLINE_SALE OS
ON UI.USER_ID = OS.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY TO_CHAR(OS.SALES_DATE, 'YYYY'), TO_NUMBER(TO_CHAR(OS.SALES_DATE, 'MM')), UI.GENDER
ORDER BY YEAR ASC, MONTH ASC, GENDER ASC