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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

코드설명

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

+ Recent posts