본문 바로가기
SQL

프로그래머스 년, 월, 성별 별 상품 구매 회원 수 구하기

by Shark_상어 2023. 3. 27.
728x90

문제 설명

다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 입니다.USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.

Column nameTypeNullable
USER_ID INTEGER FALSE
GENDER TINYINT(1) TRUE
AGE INTEGER TRUE
JOINED DATE FALSE

GENDER 컬럼은 비어있거나 0 또는 1의 값을 가지며 0인 경우 남자를, 1인 경우는 여자를 나타냅니다.

ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며, ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.

Column nameTypeNullable
ONLINE_SALE_ID INTEGER FALSE
USER_ID INTEGER FALSE
PRODUCT_ID INTEGER FALSE
SALES_AMOUNT INTEGER FALSE
SALES_DATE DATE FALSE

동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.


문제

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


예시

예를 들어 USER_INFO 테이블이 다음과 같고

USER_IDGENDERAGEJOINED
1 1 26 2021-06-01
2 NULL NULL 2021-06-25
3 0 NULL 2021-06-30
4 0 31 2021-07-03
5 1 25 2021-07-09
6 1 33 2021-07-14

ONLINE_SALE 테이블이 다음과 같다면

ONLINE_SALE_IDUSER_IDPRODUCT_IDSALES_AMOUNTSALES_DATE
1 1 54 1 2022-01-01
2 1 3 2 2022-01-25
3 4 34 1 2022-01-30
4 6 253 3 2022-02-03
5 2 31 2 2022-02-09
6 5 35 1 2022-02-14
7 5 57 1 2022-02-18

2022년 1월에 상품을 구매한 회원은 USER_ID 가 1(GENDER=1), 4(GENDER=0)인 회원들이고,
2022년 2월에 상품을 구매한 회원은 USER_ID 가 2(GENDER=NULL), 5(GENDER=1), 6(GENDER=1)인 회원들 이므로,

년, 월, 성별 별로 상품을 구매한 회원수를 집계하고, 년, 월, 성별을 기준으로 오름차순 정렬하면 다음과 같은 결과가 나와야 합니다.

YEARMONTHGENDERUSERS
2022 1 0 1
2022 1 1 1
2022 2 1 2

 

2.코드

SELECT


YEAR(B.SALES_DATE) AS YEAR, 
MONTH(B.SALES_DATE) AS MONTH, 
A.GENDER AS GENDER,
COUNT(DISTINCT A.USER_ID) AS USERS

FROM USER_INFO AS A
INNER JOIN ONLINE_SALE AS B
ON A.USER_ID = B.USER_ID

WHERE A.GENDER IS NOT NULL
GROUP BY YEAR, MONTH, GENDER
ORDER BY YEAR, MONTH, GENDER

 

3.문제 풀이

1.우선 문제의 요구 사항 부터 파악 해보자

1) 구매한 년도, 구매한 월, 구매한 성별, 구매한 유저의 수를 구해야 한다.

2) 이를 오름 차순으로 나타내야 한다.

 

2. 1-1번의 데이터를 얻기 위해서는 기본적으로 두 테이블 간의 JOIN이 필요하다.

USER_INFO 테이블 과 ONLINE_SALE 테이블 끼리 JOIN 한다.

 

3. 구매한 성별을 구별한다.

문제에서 요구한 사항 중 NULL 표기된 성별은 카운트 하지 않겠다 라고 요구했다.

그럼으로 WHERE 으로 NULL로 표기되지 않은 데이터만 필터링 하면 된다.

 

4.년도, 월, 성별 을 기준으로 임의의 답을 제공 하고 있다.

즉, 년도, 월, 성별을 기준으로 GROUP 하여 데이터를 필터링 한다.

 

5. GROUP 의 기준이 되었던 필드로 오름 차순을 진행 한다.

즉 GROUP BY를 그냥 ORDER BY으로 수정하여 복사넣기 하면 된다.

 

6.구매한 유저의 수를 구하라

 

5번 까지 풀이 따라 왓다면 유저의 수가 중복으로 포함 되어 있다.

중복을 제거해서 SELECT 해야 한다. 중복을 제거 할 수 있는 DISTINCT를 활용하여 SELECT 하면 된다.

 

 

728x90