코드카타_260122

3eo·2026년 1월 22일

1. 문제링크:

https://school.programmers.co.kr/learn/courses/30/lessons/131532
USER_INFO 테이블과 ONLINE_SALE 테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성해주세요. 결과는 년, 월, 성별을 기준으로 오름차순 정렬해주세요. 이때, 성별 정보가 없는 경우 결과에서 제외해주세요.

2. 정답코드:

3. 오류상황:

SELECT 
	YEAR(O.SALES_DATE) AS YEAR, 
    MONTH(O.SALES_DATE) AS MONTH, 
    U.GENDER, 
    COUNT(U.USER_ID) AS USERS # 년 월 성별 별로 상품 구매한 회원수 
FROM USER_INFO U 
JOIN ONLINE_SALE O 
ON U.USER_ID=O.USER_ID 
GROUP BY YEARS(O.SALES_DATE), MONTH(O.SALES_DATE), U.GENDER 
ORDER BY YEAR, MONTH, U.GENDER

1. YEARS() 함수 ❌

GROUP BY YEARS(O.SALES_DATE), MONTH(O.SALES_DATE), U.GENDER

YEARS()라는 함수는 존재하지 않는다
SELECT 절에서는 YEAR(O.SALES_DATE)를 썼는데
GROUP BY에서는 순간 헷갈려서 잘못 표기함

2. 성별이 NULL인 회원을 제외하지 않음

문제 조건 : 성별 정보가 없는 경우 결과에서 제외
하지만 현재 쿼리에는 이 조건이 없음. 문제를 꼼꼼히 읽어볼 것

3. 회원 수 집계 방식: 중복 가능성 ⚠️

한 회원이 같은 달에 여러 상품을 구매할 수 있음
그러면 같은 USER_ID가 여러 번 COUNT됨

문제에서 요구한 것은 상품을 구매한 회원 수
→ 즉, 중복 제거된 회원 수

4. 해결방법:

SELECT 
	YEAR(O.SALES_DATE) AS YEAR, 
    MONTH(O.SALES_DATE) AS MONTH,
	U.GENDER, 
    COUNT(DISTINCT U.USER_ID) AS USERS
# 년 월 성별 별로 상품 구매한 회원수
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID=O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR(O.SALES_DATE), MONTH(O.SALES_DATE), U.GENDER
ORDER BY YEAR, MONTH, U.GENDER

1. YEARS() 👉 YEAR()

2. WHERE절로 성별에 대한 조건 추가

3. 회원 ID 중복제거를 위해 DISTINCT 추가

0개의 댓글