문제풀이/SQL(Oracle)
상품을 구매한 회원 비율 구하기 - 작동순서 추가하기
kime2
2024. 3. 21. 09:57
https://school.programmers.co.kr/learn/courses/30/lessons/131534#
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
문제에 대한 해석
-- 조건1: 2021년에 가입한 전체 회원
-- 조회 :년,월별, 구매자수, 월별 구입자/2021년의 전체 가입자(소수점 둘째자리에서 반올림)
-- 정렬: 년, 월
오답
SELECT to_char(sales_date,'YYYY') as YEAR, to_char(sales_date,'MM') as MONTH,
count(distinct(o.user_id)) as PUCHASED_USER,
round(count(distinct(o.user_id)) /count(u.user_id),1) as PUCHASED_RATIO
from user_info u left join online_sale o
on u.user_id = o.user_id
where to_char(joined,'YYYY') ='2021'
group by to_char(sales_date,'YYYY'), to_char(sales_date,'MM')
having to_char(sales_date,'YYYY') is not null
order by YEAR, MONTH
원인 : 2021년의 전체 가입자가 년,월별 그룹바이 되어 집계됨
정답
SELECT TO_CHAR(SALES_DATE,'YYYY') AS YEAR,
TO_NUMBER(TO_CHAR(SALES_DATE,'MM' )) AS MONTH,
COUNT(UNIQUE(A.USER_ID)) AS PUCHASED_USERS,
ROUND(COUNT(UNIQUE(A.USER_ID)) / (SELECT COUNT(*) AS CNT FROM USER_INFO WHERE TO_CHAR(JOINED, 'YYYY') = '2021'), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE A join USER_INFO B
on A.USER_ID = B.USER_ID
AND TO_CHAR(B.JOINED, 'YYYY') = '2021'
GROUP BY TO_CHAR(SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(SALES_DATE,'MM' ))
ORDER BY TO_CHAR(SALES_DATE,'YYYY'), TO_NUMBER(TO_CHAR(SALES_DATE,'MM' ))
;
작동순서
💡SQL 실행 순서는 From -> Where -> Group by -> Having -> Select -> Order by ->결과반환
- FROM 절:
- WHERE 절:
- GROUP BY 절:
- HAVING 절:
- SELECT 절:
- ORDER BY 절:
- 결과반환: