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절 내부만 수정하면 되어 관리가 용이하다
'코딩테스트' 카테고리의 다른 글
| [26.03.25 코테/회고(MySQL/Oracle)]-입양 시각 구하기(1) (0) | 2026.03.25 |
|---|---|
| [26.03.24 코테/회고(MySQL)]-없어진 기록 찾기 (0) | 2026.03.24 |
| [26.03.20 코테/회고(MySQL)]-업그레이드 할 수 없는 아이템 구하기 (0) | 2026.03.20 |
| [26.03.19 코테/회고(MySQL)]-주문량이 많은 아이스크림 조회하기 (0) | 2026.03.19 |
| [26.03.18 코테/회고(MySQL)]-즐겨찾기가 가장 많은 식당 정보 출력하기 (0) | 2026.03.18 |