다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 입니다.USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.
Column nameTypeNullableUSER_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 nameTypeNullableONLINE_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_IDGENDERAGEJOINED1 | 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_DATE1 | 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)인 회원들 이므로,
년, 월, 성별 별로 상품을 구매한 회원수를 집계하고, 년, 월, 성별을 기준으로 오름차순 정렬하면 다음과 같은 결과가 나와야 합니다.
YEARMONTHGENDERUSERS2022 | 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 하면 된다.
'SQL' 카테고리의 다른 글
MYSQL VIRTUAL 과 STORED 란? (0) | 2024.07.28 |
---|---|
파이썬으로 다루는 MySQL (0) | 2023.04.10 |
프로그래머스 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (1) | 2023.03.26 |
MYSQL 문자열 합치기 / 문자열 자르기 / 문자열 바꾸기 (0) | 2023.03.25 |
프로그래머스 조건에 맞는 사용자와 총 거래금액 조회하기 (0) | 2023.03.25 |