본문 바로가기
문제풀이/SQL(Oracle)

상품을 구매한 회원 비율 구하기 - 작동순서 추가하기

by kime2 2024. 3. 21.
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 ->결과반환

 

  1. FROM 절
  2. WHERE 절:
  3. GROUP BY 절:
  4. HAVING 절:
  5. SELECT 절
  6. ORDER BY 절:
  7. 결과반환