Notice
Recent Posts
Recent Comments
Archives
반응형
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
Today
Total
11-14 12:04
250x250
관리 메뉴

꿈꾸는 개발자의 블로그

[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 상품을 구매한 회원 비율 구하기 본문

Algorithm/Programmers

[프로그래머스] Oracle - (SQL 고득점 Kit) JOIN 상품을 구매한 회원 비율 구하기

aldrn29 2023. 2. 27. 13:57

문제

USER_INFO 테이블과 ONLINE_SALE 테이블에서 1) 2021년에 가입한 전체 회원들 중 3) 상품을 구매한 회원수와 5) 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 4) 2021년에 가입한 전체 회원 수)을 2) 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.

 

문제 풀이

인라인 뷰 2개를 이용한 풀이

  1. 두 테이블을 JOIN 후, 가입한 날짜를 확인하기 위하여 WHERE 조건을 건다. (T1)
  2. 년, 월 별로 조회하기 위하여 GROUP BY로 묶는다. (T1)
  3. 상품을 구매한 회원수를 구하기 위하여 DISTINCT로 중복 회원을 제거하고, count 함수로 구한다. (T1)
  4. USER_INFO 테이블에서만 WHERE 조건을 걸어 전체 회원 수를 알아낸다. (T2)
  5. 상품을 구매한 회원의 비율을 계산한다.

스칼라 서브쿼리를 이용한 풀이

  1. 두 테이블을 JOIN 후, 가입한 날짜를 확인하기 위하여 WHERE 조건을 건다.
  2. 년, 월 별로 조회하기 위하여 GROUP BY로 묶는다.
  3. 상품을 구매한 회원수를 구하기 위하여 DISTINCT로 중복 회원을 제거하고, count 함수로 구한다.
  4. USER_INFO 테이블에서만 WHERE 조건을 걸어 전체 회원 수를 알아내고, 상품을 구매한 회원의 비율을 계산한다. 

 

USER_ID 테이블과 ONLINE_SALE 테이블 JOIN 과정
USER_ID 테이블과 ONLINE_SALE 테이블 JOIN 결과
WHERE 조건
GROUP BY로 묶고 DISTINCT로 중복 제거한 회원 수의 비율 계산

 

전체 코드

인라인 뷰 2개를 이용한 풀이

SELECT YEAR, MONTH, PUCHASED_USERS, ROUND(PUCHASED_USERS / TOTAL, 1) AS PUCHASED_RATIO	-- 5
FROM (
    /* T1 */
    SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR, 
        TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH, 
        count(DISTINCT a.USER_ID) AS PUCHASED_USERS			-- 3
    FROM USER_INFO a JOIN ONLINE_SALE b ON a.USER_ID = b.USER_ID
    WHERE TO_CHAR(JOINED, 'YYYY') = '2021'				-- 1
    GROUP BY TO_CHAR(SALES_DATE, 'YYYY'), TO_CHAR(SALES_DATE, 'MM')	-- 2
), (
    /* T2 */
    SELECT count(DISTINCT USER_ID) AS TOTAL				-- 4
    FROM USER_INFO  
    WHERE TO_CHAR(JOINED, 'YYYY') = '2021'
)
ORDER BY 1, 2

스칼라 서브쿼리를 이용한 풀이

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR, 
    TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH, 
    count(DISTINCT a.USER_ID) AS PUCHASED_USERS,			-- 3
    ROUND(count(DISTINCT a.USER_ID) / (					-- 4
        SELECT count(DISTINCT USER_ID) AS TOTAL
        FROM USER_INFO  
        WHERE TO_CHAR(JOINED, 'YYYY') = '2021'		
    ), 1) AS PUCHASED_RATIO
FROM USER_INFO a JOIN ONLINE_SALE b ON a.USER_ID = b.USER_ID
WHERE TO_CHAR(JOINED, 'YYYY') = '2021'					-- 1
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'), TO_CHAR(SALES_DATE, 'MM')		-- 2
ORDER BY 1, 2

 

728x90
728x90
Comments