https://school.programmers.co.kr/learn/courses/30/lessons/131534
-- 코드를 입력하세요
select a.YEAR
, a.MONTH * 1 as MONTH
, count(a.USER_ID) as PUCHASED_USERS
, round(count(a.USER_ID)/(select count(u.USER_ID) from USER_INFO u where date_format(u.JOINED, '%Y') = '2021'), 1) as PUCHASED_RATIO
from (
SELECT distinct b.USER_ID
, date_format(b.SALES_DATE, '%Y') YEAR
, date_format(b.SALES_DATE, '%m') MONTH
, date_format(b.SALES_DATE, '%Y-%m') YM
from ONLINE_SALE b
inner join USER_INFO u
on b.USER_ID = u.USER_ID
and date_format(u.JOINED, '%Y') = '2021'
) a
group by a.YM
order by YEAR, MONTH
# select a.YEAR
# , a.MONTH * 1 as MONTH
# , count(distinct a.USER_ID) as PUCHASED_USERS
# , round(count(distinct a.USER_ID)/count(distinct b.USER_ID), 1) as PUCHASED_RATIO
# from (
# SELECT distinct b.USER_ID
# , date_format(b.SALES_DATE, '%Y') YEAR
# , date_format(b.SALES_DATE, '%m') MONTH
# , date_format(b.SALES_DATE, '%Y-%m') YM
# from ONLINE_SALE b
# ) a
# inner join USER_INFO b
# on date_format(b.JOINED, '%Y-%m') <= a.YM
# and b.GENDER is not null
# group by a.YM
# order by YEAR, MONTH
문제 제대로 안읽음;;
이게 레벨 5던데, 문제 자체가 그냥 헷갈림...내가 대충 읽은건가;;
첨에 아래 쿼리 만들었는데,,
아래 쿼리는 (매월 구매회원 / 매월 회원수)을 구하는거임...아 이정도 되니까 레벨5 구나 싶었음.
근데 아무리 돌려도 정답이 아니라길래;;
뭐 2021년 회원 중...이라는;; 이걸 읽지도 않고, 반올림 하는것도 안읽고;;
위 쿼리에선 스칼라서브쿼리를 사용하였다, 2021년 이라는 데이터에 대해서 반복적으로 가져올테니, 매 행마다 실행하는게 아니라,
한번 실행하고 메모리에 올려두고 재사용할테니 요게 더 빠를 거라 판단,
아래 쿼리의 경우 매년 매월 이라는 그나마 좀 다양한 경우의 수가 있기에, 범위가 커질수록 스칼라서브쿼리가 불리할거라 판단했고,
조인을 통해 가져오는 영역은 count(distinct b.USER_ID) 뿐일거라, 범위의 데이터를 통으로 가져오는게 아니라, 저걸 위한 데이터를 알아서 옵티마이저가 잘 연산해 주겠지 하는 막연한 믿음으로 작성한 쿼리,
동등 조인이 아니기에 일반적인 상황에선 쓰일수 없는 쿼리;
'서버 > DB' 카테고리의 다른 글
[프로그래머스/SQL] 년, 월, 성별 별 상품 구매 회원 수 구하기 (0) | 2023.02.21 |
---|---|
[프로그래머스/SQL] 식품분류별 가장 비싼 식품의 정보 조회하기 (0) | 2023.02.21 |
[프로그래머스/SQL] 오프라인/온라인 판매 데이터 통합하기 (0) | 2023.02.21 |
MySQL InnoDB 테이블에서 최대 행의 갯수는? (maximum number of recoreds in mysql innodb) (0) | 2023.02.15 |
[MySQL] 계정 생성 및 권한부여 (0) | 2022.02.17 |