코딩테스트

[26.03.23 코테/회고(MySQL/Oracle)]-년, 월, 성별 별 상품 구매 회원 수 구하기

지니248 2026. 3. 23. 13:25

Lv4. 년, 월, 성별 별 상품 구매 회원 수 구하기 (MySQL)

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

 

내가 작성한 코드

-- 풀이1
SELECT YEAR(S.SALES_DATE) AS YEAR
       ,MONTH(S.SALES_DATE) AS MONTH
       ,I.GENDER
       ,COUNT(DISTINCT S.USER_ID) AS USERS
FROM USER_INFO I
JOIN ONLINE_SALE S
  ON I.USER_ID = S.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY YEAR, MONTH, I.GENDER
ORDER BY YEAR ASC, MONTH ASC, I.GENDER ASC;

-- 풀이2
-- WITH절: 구매 이력, 성별 정보
WITH MONTHLY_SALES AS (
    SELECT YEAR(S.SALES_DATE) AS YEAR
           ,MONTH(S.SALES_DATE) AS MONTH
           ,I.GENDER
           ,S.USER_ID
    FROM USER_INFO I
    JOIN ONLINE_SALE S
      ON I.USER_ID = S.USER_ID
    WHERE I.GENDER IS NOT NULL
)
SELECT YEAR, MONTH, GENDER, COUNT(DISTINCT USER_ID) AS USERS
FROM MONTHLY_SALES
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER;

 

Oracle

SELECT EXTRACT(YEAR FROM SALES_DATE) AS YEAR
       ,EXTRACT(MONTH FROM SALES_DATE) AS MONTH
       ,I.GENDER
       ,COUNT(DISTINCT S.USER_ID) AS USERS
FROM USER_INFO I
JOIN ONLINE_SALE S
  ON I.USER_ID = S.USER_ID
WHERE GENDER IS NOT NULL
GROUP BY EXTRACT(YEAR FROM SALES_DATE), EXTRACT(MONTH FROM SALES_DATE), I.GENDER
ORDER BY EXTRACT(YEAR FROM SALES_DATE) ASC, EXTRACT(MONTH FROM SALES_DATE) ASC, I.GENDER ASC

 

문제 회고

1. DISTINCT 작성

- 문제에서 제시하는 것은 '구매한 회원 수' 이다

- 동일한 회원이 같은 달에 여러 번 구매했거나 여러 개의 상품을 샀을 경우 단순 COUNT를 하면 중복이 발생한다

- 따라서 USER_ID에 DISTINCT를 적용하여 중복을 제거한 회원수만 정확하게 집계해야한다

2. WITH절 활용

- WITH절을 활용하면 추후에 분석 조건이 바뀌더라도 WITH절 내부만 수정하면 되어 관리가 용이하다