본문 바로가기
Data Science/SQL

[SQL/오답] 다차원 그룹화와 중복 제거를 활용한 데모그래픽 지표 산출 (프로그래머스 Lv4)

by 에르모사 쩐뉴 2026. 2. 15.

[SQL/Level 4] 년, 월, 성별 별 상품 구매 회원 수 구하기

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

1. Problem

온라인 쇼핑몰의 유저 정보와 판매 데이터를 결합하여, 년, 월, 성별이라는 세 가지 차원을 기준으로 구매 회원 수를 집계해야 한다. 이때 성별 미기입(NULL) 회원은 제외해야 하며, 동일한 유저가 같은 달에 여러 번 구매했더라도 단 한 명의 유저로 카운트해야 하는 '실구매자 수(Unique Users)' 산출이 핵심 과제이다.

2. Solution

테이블 조인을 통해 성별 정보를 가져온 뒤, 날짜 함수와 중복 제거 집계 함수를 조합하여 해결한다.

  • COUNT(DISTINCT USER_ID): 비즈니스 지표에서 '구매 건수(Sales)'가 아닌 '구매 유저 수(Users)'를 구할 때 필수적인 함수이다.
  • YEAR(), MONTH(): 단일 날짜 컬럼에서 분석에 필요한 시계열 단위를 추출하여 그룹화의 기준으로 활용한다.

3. Takeaway (데모그래픽 분석과 데이터 정합성)

복합적인 조건의 대용량 데이터를 다룰 때 분석가가 견지해야 할 기술적 관점을 정립한다.

  • 지표의 명확한 정의: '객수'와 '건수'의 차이를 구분하지 못하면 데이터 분석 결과는 왜곡된다. DISTINCT를 활용해 순수 구매자 수를 추출하는 능력은 비즈니스 의사결정의 신뢰도를 결정하는 객관적 기준이 된다.
  • 데이터 필터링의 선제적 적용: 실무 데이터에 산재한 NULL 값은 통계의 노이즈가 된다. 문제의 조건에 따라 IS NOT NULL을 선제적으로 적용하여 분석 대상 집단(Cohort)을 명확히 정의하는 습관이 중요하다.
  • 다차원 집계의 통찰: 데이터를 년-월-성별로 쪼개어 보는 과정은 단순히 쿼리를 짜는 행위를 넘어, 특정 시점이나 특정 집단에서 발생하는 트렌드 변화를 포착하기 위한 분석의 기초 공사이다.

 

 

1. 데이터 테이블 구조

👤 회원 정보 (USER_INFO)

Column name Type Description
USER_ID INTEGER 회원 ID
GENDER TINYINT 성별 (0: 남자, 1: 여자, NULL: 미기입)

📈 판매 정보 (ONLINE_SALE)

Column name Type Description
USER_ID INTEGER 구매한 회원 ID
SALES_DATE DATE 판매일 (년, 월 추출의 기준)

2. 문제 풀이 핵심 포인트 (Key Logic)

① 성별 정보가 없는 경우 제외 (IS NOT NULL)

문제 조건에 "성별 정보가 없는 경우 결과에서 제외"하라는 명시적 조건이 있습니다. WHERE GENDER IS NOT NULL을 통해 쓰레기 데이터를 먼저 걸러내야 합니다.

② 중복 회원 카운트 (COUNT(DISTINCT))

한 회원이 같은 달에 여러 번 쇼핑을 했을 수 있습니다. 우리는 '판매 건수'가 아니라 **'구매한 회원 수'**가 궁금하므로, 반드시 USER_ID에 DISTINCT를 걸어주어야 합니다.

③ 날짜 데이터 분해

SALES_DATE 하나에서 YEAR()와 MONTH() 함수를 사용해 그룹화의 기준이 될 두 개의 컬럼을 생성합니다.

 

정답 쿼리

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

 

쿼리테스트 출제자의 의도

이 문제는 실무에서 **'데모그래픽(Demographic) 분석'**을 할 수 있는 기초 체력을 검증합니다.

1) 다차원 그룹화 능력

보통 한 가지 기준으로만 묶는 것과 달리, 년-월-성별이라는 세 가지 계층으로 데이터를 쪼개서 볼 수 있는지 확인합니다.

  • 의도: "복합적인 조건에서도 데이터의 정합성을 유지하며 집계할 수 있는가?"

2) 데이터 정제(Data Cleaning) 역량

실무 데이터는 늘 지저분합니다. NULL 값을 어떻게 처리하느냐에 따라 통계 결과가 크게 달라집니다. 조건을 정확히 읽고 불필요한 데이터를 배제하는 꼼꼼함을 봅니다.

  • 의도: "예외 상황(NULL)을 인지하고 적절한 필터를 적용하는가?"

3) 정확한 지표 정의 (COUNT vs COUNT DISTINCT)

비즈니스 지표에서 '객수(Users)'와 '건수(Transactions)'는 완전히 다른 개념입니다. 이 차이를 명확히 인지하고 DISTINCT를 사용했는지가 합격의 당락을 결정합니다.


🚩 분석 팁

"분석의 시작은 쪼개기다."
전체 구매자 수만 보면 보이지 않던 인사이트가 '월별', '성별'로 쪼개는 순간 보이기 시작한다.
예를 들어 "왜 2월에는 여성 구매자가 급증했을까?" 같은 질문이 데이터 분석의 시작.