1. 문제
1) 문제 설명
다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 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 조합에 대해서는 하나의 판매 데이터만 존재합니다.
2) 문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월별로 출력하는 SQL문을 작성해주세요.
상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
3) 출력 예시
YEAR | MONTH | PUCHASED_USERS | PUCHASED_RATIO |
2022 | 1 | 2 | 0.5 |
2022 | 2 | 1 | 0.3 |
2. 코드
SELECT DATE_FORMAT(O.SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(O.SALES_DATE, '%m') AS Month,
COUNT(DISTINCT O.USER_ID) AS PUCHASED_USERS,
ROUND(COUNT(DISTINCT O.USER_ID) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED like "2021%"),1)
AS PUCHASED_RATIO
FROM ONLINE_SALE AS O
JOIN USER_INFO AS U
ON U.USER_ID = O.USER_ID
WHERE U.JOINED like "2021%"
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
- SELECT에서 년, 월, 구매자 수, 구매 비율을 선택
- DATE_FORMAT(O.SALES_DATE, '%m') : 월/연별로 날짜를 뽑아옴
- COUNT(DISTINCT O.USER_ID) : 전체 구매자의 수를 출력. 이때, 중복되는 ID를 제거.
- (SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED like "2021%") : 2021년 전체 가입자의 수
- ROUND(**, 1) : 소수점 둘째 자리에서 반올림
- JOIN으로 가입자 정보 테이블과 구매자 정보 테이블을 합침
- ON U.USER_ID = O.USER_ID : 두 테이블이 사용자 ID를 기준으로 JOIN
- WHERE U.JOINED like "2021%" : 이때, 2021년에 대한 정보만 포함되도록 함
- GROUP BY YEAR, MONTH : 이 문제는 연도와 월별로 총 구매 비율과 수를 보고 싶어하므로 그룹화
- ORDER BY YEAR, MONTH : 오름차순으로 정렬
문제 출처
https://school.programmers.co.kr/learn/courses/30/lessons/131534
'코딩테스트 > SQL' 카테고리의 다른 글
[프로그래머스]없어진 기록 찾기 (MySQL/Lv. 3) (0) | 2024.04.27 |
---|---|
[프로그래머스]재구매가 일어난 상품과 회원 리스트 구하기 (MySQL/Lv. 2) (1) | 2024.04.26 |
[프로그래머스]평균 일일 대여 요금 구하기 (MySQL/Lv. 1) (0) | 2024.04.26 |