문제 설명
다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.
Column name | Type | Nullable |
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 name | Type | Nullable |
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_ID | GENDER | AGE | JOINED |
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_ID | USER_ID | PRODUCT_ID | SALES_AMOUNT | SALES_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)인 회원들 이므로,
년, 월, 성별 별로 상품을 구매한 회원수를 집계하고, 년, 월, 성별을 기준으로 오름차순 정렬하면 다음과 같은 결과가 나와야 합니다.
YEAR | MONTH | GENDER | USERS |
2022 | 1 | 0 | 1 |
2022 | 1 | 1 | 1 |
2022 | 2 | 1 | 2 |
코드
SELECT YEAR(S.SALES_DATE) AS YEAR,
MONTH(S.SALES_DATE) AS MONTH,
I.GENDER,
COUNT(DISTINCT I.USER_ID) AS USERS
FROM USER_INFO I
INNER JOIN ONLINE_SALE S
ON I.USER_ID = S.USER_ID
WHERE I.GENDER IS NOT NULL
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
SELECT ~ FROM 절
USER_INFO 테이블과 ONLINE_SALE 테이블에서 SALES_DATE를 통해 구한 YEAR과 MONTH, GENDER, USER_ID를 통해 구한 USERS 컬럼을 조회한다.
YEAR과 MONTH 함수를 통해 YEAR 컬럼과 MONTH 컬럼을 쉽게 구할 수 있으며, USERS는 USER_ID를 중복 제거하여 COUNT 함수를 통해 집계하여 구할 수 있다.
JOIN ON 절
USER_INFO 테이블(I)과 ONLINE_SALE 테이블(S)을 INNER JOIN 한다. 조인 조건으로 I 테이블의 USER_ID와 S 테이블의 USER_ID가 같은 행을 조인하도록 한다.
WHERE 절
I 테이블의 GENDER가 NULL이 아닌 경우에 조회하도록 한다.
GROUP BY 절
YEAR, MONTH, GENDER를 기준으로 그룹화한다. 세 가지 컬럼을 그룹화하면 년, 월, 성별 별로 상품을 구매한 회원수를 집계할 수 있다.
ORDER BY 절
YEAR를 기준으로 오름차순 정렬하고, YEAR이 같으면 MONTH를 기준으로 오름차순 정렬 하며, MONTH도 같으면 GENDER를 기준으로 오름차순 정렬한다.
'코딩 테스트(Coding Test) > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 우유와 요거트가 담긴 장바구니 - MySQL (0) | 2023.06.21 |
---|---|
[프로그래머스] 취소되지 않은 진료 예약 조회하기 - MySQL (0) | 2023.06.20 |
[프로그래머스] 서울에 위치한 식당 목록 출력하기 - MySQL (0) | 2023.06.18 |
[프로그래머스] 5월 식품들의 총매출 조회하기 - MySQL (0) | 2023.06.17 |
[프로그래머스] 식품분류별 가장 비싼 식품의 정보 조회하기 - MySQL (0) | 2023.06.16 |