728x90
https://school.programmers.co.kr/learn/courses/30/lessons/131534
문제설명
다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은
USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 입니다.
USER_INFO 테이블은 아래와 같은 구조로 되어있으며
USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.
GENDER 컬럼은 비어있거나 0 또는 1의 값을 가지며 0인 경우 남자를, 1인 경우는 여자를 나타냅니다.
ONLINE_SALE 테이블은 아래와 같은 구조로 되어있며
ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는
각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서
2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와
상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을
년, 월 별로 출력하는 SQL문을 작성해주세요.
상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고,
전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
풀이 GIT
해당문제를 접근할때 주의할점은
월은 01 02식으로 출력하는 것이아닌 1 2 3 으로 출력하기 때문에 숫자로 변경하여줬습니다.
1. 2021년에 가입한 사람 분류
2. 구매 년,월 기준으로 그룹
3. 중복제거후 구매회원수 구하기
4. 상품을 구매한 회원의 비율구하기
5. 년 월 오름차순
SELECT TO_CHAR(o.SALES_DATE,'YYYY') AS year
, TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM')) AS month
, COUNT(DISTINCT o.user_id) as puchased_users -- (3) 중복제거후 구매회원수 구하기
, ROUND(COUNT(DISTINCT o.user_id)/(SELECT count(user_id)
FROM user_info
WHERE TO_CHAR(joined,'YYYY') = '2021'),1) as puchased_ratio
-- (4) 상품을 구매한 회원의 비율구하기
FROM ONLINE_SALE o , (SELECT user_id
FROM user_info
WHERE TO_CHAR(joined,'YYYY') = '2021') u --(1) 2021년에 가입한 사람 분류
WHERE u.user_id = o.user_id
GROUP BY TO_CHAR(o.SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM')) --(2) 구매 년,월 기준으로 그룹
ORDER BY year, month --(5) 년 월 오름차순
;
--with문 적용 240730 ADD
WITH user_2021 as (SELECT user_id
FROM user_info
WHERE TO_CHAR(joined,'YYYY') = '2021')
SELECT TO_CHAR(o.SALES_DATE,'YYYY') AS year
, TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM')) AS month
, COUNT(DISTINCT o.user_id) as puchased_users
, ROUND(COUNT(DISTINCT o.user_id)/(SELECT count(*) FROM user_2021),1) as puchased_ratio
FROM ONLINE_SALE o , user_2021 u
WHERE u.user_id = o.user_id
GROUP BY TO_CHAR(o.SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(o.SALES_DATE,'MM'))
ORDER BY year, month
;
GROUP BY는 SELECT보다 실행순서가 빠르기 때문에 SELECT의 별칭이 되지않고
ORDER BY는 SELECT보다 실행순서가 느리기 때문에 SELECT의 별칭이 됩니다
728x90
'==4. 프로그래머스 & 코테문제== > SQL 문제 풀이' 카테고리의 다른 글
[Oracle/프로그래머스 LV.1] SELECT/흉부외과 또는 일반외과 의사 목록 출력하기 (0) | 2024.10.05 |
---|---|
[MYSQL/프로그래머스 LV.5] SELECT/멸종위기의 대장균 찾기 (0) | 2024.10.02 |
[Oracle/프로그래머스 LV.3] 카테고리 별 도서 판매량 집계하기 (0) | 2024.07.27 |
[Oracle/프로그래머스 LV.1] IS NULL / 경기도에 위치한 식품창고 목록 출력하기 (0) | 2024.07.27 |
[Oracle/프로그래머스 LV.1] 가장 비싼 상품 구하기 (0) | 2024.07.22 |
댓글