김재호

프로그래머스 SQL 본문

코딩테스트

프로그래머스 SQL

Kimjaeho 2026. 2. 27. 18:11

테이블 결합 (JOIN)

FROM ONLINE_SALE A
JOIN USER_INFO B ON A.USER_ID = B.USER_ID
 
  • ONLINE_SALE 테이블에는 실제 구매 이력이 저장되어 있고
  • USER_INFO 테이블에는 사용자의 성별 정보가 저장되어 있습니다.

구매 이력만으로는 성별을 알 수 없기 때문에,
USER_ID를 기준으로 두 테이블을 조인하여
“누가 언제 구매했고, 그 사용자의 성별은 무엇인지”를 함께 사용할 수 있도록 합니다.

성별 정보가 없는 데이터 제외

WHERE GENDER IS NOT NULL
 

성별 기준 통계를 내는 것이 목적이므로
성별이 없는(NULL) 데이터는 분석 대상에서 제외합니다.

이를 통해 결과가 더 명확해지고,
성별별 사용자 수 비교가 왜곡되지 않도록 합니다.

연도·월 단위로 기간 분리

YEAR(SALES_DATE) AS YEAR,
MONTH(SALES_DATE) AS MONTH
 
  • SALES_DATE에서 연도와 월만 추출해
  • 하루 단위가 아닌 월 단위 분석이 가능하도록 구성합니다.

이 방식은 월별 트렌드 분석이나
기간별 사용자 변화 추이를 볼 때 매우 자주 사용됩니다.

구매 사용자 수 집계의 핵심: DISTINCT

COUNT(DISTINCT A.USER_ID) AS USERS
 

이 부분이 쿼리에서 가장 중요한 핵심입니다.

  • 한 사용자가 같은 달에 여러 번 구매하더라도
  • DISTINCT USER_ID를 사용해 1명으로만 계산합니다.

만약 COUNT(USER_ID)를 사용했다면
이 쿼리는 “구매 횟수”를 세는 쿼리가 되어
분석 목적과 완전히 다른 결과가 나옵니다.

그룹화 기준 (GROUP BY)

GROUP BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
 
  • 연도
  • 성별

이 세 가지 조합을 기준으로 데이터를 묶어
각 기간·성별별 구매 사용자 수를 계산합니다.

결과적으로 다음과 같은 형태의 데이터가 만들어집니다.

  • 2022년 3월 / 남성 / 120명
  • 2022년 3월 / 여성 / 98명

정렬 기준 (ORDER BY)

 
 
ORDER BY YEAR(SALES_DATE), MONTH(SALES_DATE), GENDER
 
  • 연도 → 월 → 성별 순으로 정렬하여
  • 시간 흐름이 자연스럽게 보이도록 구성합니다.

 

'코딩테스트' 카테고리의 다른 글

프로그래머스 SQL  (0) 2026.02.27
프로그래머스 SQL  (0) 2026.02.21
프로그래머스 SQL  (0) 2026.02.21
프로그래머스 SQL  (0) 2026.02.21
프로그래머스 SQL  (0) 2026.02.21