https://school.programmers.co.kr/learn/courses/30/lessons/131534#
문제
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 절:
- 결과반환:
'문제풀이 > SQL(Oracle)' 카테고리의 다른 글
입양 시각 구하기(2) (0) | 2024.03.22 |
---|---|
[문제풀이] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.03.20 |
[문제풀이] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.03.20 |
[문제풀이] DATETIME에서 DATE로 형 변환 (0) | 2024.02.01 |
[문제풀이] NULL 처리하기/경기도에 위치한 식품창고 목록 출력하기 (0) | 2024.02.01 |