상품알고리즘 풀이 방법입니다.
문제(Problem) -> 생각(Think) -> 해결책(Solution) -> 리뷰(Review) 를 통해서 정리해서 작성합니다.
Problem📄

https://school.programmers.co.kr/learn/courses/30/lessons/131534

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


Think🤔

회원정보 테이블 : USER_INFO

온라인 상품 판매 정보 : ONLINE_SALE 

컬럼 : USER_ID , GENDER , AGE , JOINED

 

아이디 / USER_ID / INTEGER / FALSE(널값 허용)

성별 / GENDER / TINYINT(1) / TRUE / GENDER 0 -> 남자 , 1 -> 여자

나이 / AGE / INTEGER / TRUE

가입일 / JOINED / DATE / FALSE

 

온라인 상품판매 ID / ONLINE_SALE_ID / INTEGER  / FALSE

회원 ID / USER_ID / INTEGER  / FALSE

상품 ID / PRODUCT_ID / INTEGER  / FALSE

판매량 / SALES_AMOUNT / INTEGER  / FALSE

판매일 / SALES_DATE / INTEGER  / FALSE

 

2021년 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율

 

상품을 구매한 회원의 비율 : 2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수

을 년,월 별로 출력

 

소수점 두번째자리에서 반올림 / 년,월 기준으로 오름차순

 

2021년에 가입한 전체 회원수

SELECT * FROM USER_INFO WHERE JOINED BETWEEN '2021/01/01' AND '2021/12/31'

2021년에 가입한 회원 중 상품을 구매한 회원수

SELECT COUNT(1) 
  FROM USER_INFO A JOIN ONLINE_SALE 
    ON A.USER_ID = B.USER_ID
 WHERE A.JOINED BETWEEN '2021/01/01' AND '2021/12/31'

 

정답 도출하는 부분

 

그룹바이로 년,월

 SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR
        , TO_CHAR(SALES_DATE, 'MM') AS MONTH
        , COUNT(1) AS PUCHASED_USERS
        , ROUND((FULL_USR / BUY_FULL_USR),2) AS PUCHASED_RATIO
   FROM (
  		 SELECT (SELECT COUNT(1) FROM USER_INFO WHERE JOINED BETWEEN '2021/01/01' AND '2021/12/31') AS FULL_USER
               , COUNT(1) AS BUY_FULL_USR
               , B.SALES_DATE AS SALES_DATE
           FROM USER_INFO A JOIN ONLINE_SALE B
             ON A.USER_ID = B.USER_ID
          WHERE JOINED BETWEEN '2021/01/01' AND '2021/12/31'
         )
GROUP BY YEAR DESC , MONTH DESC;

1차 수정

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_CHAR(SALES_DATE, 'MM') AS MONTH,
       COUNT(1) AS PURCHASED_USERS,
       ROUND((FULL_USER / BUY_FULL_USER), 2) AS PURCHASED_RATIO
FROM (
       SELECT (SELECT COUNT(1) FROM USER_INFO WHERE JOINED BETWEEN TO_DATE('2021/01/01', 'YYYY/MM/DD') AND TO_DATE('2021/12/31', 'YYYY/MM/DD')) AS FULL_USER,
              COUNT(1) AS BUY_FULL_USER,
              B.SALES_DATE AS SALES_DATE
       FROM USER_INFO A
       JOIN ONLINE_SALE B ON A.USER_ID = B.USER_ID
       WHERE JOINED BETWEEN TO_DATE('2021/01/01', 'YYYY/MM/DD') AND TO_DATE('2021/12/31', 'YYYY/MM/DD')
       GROUP BY B.SALES_DATE
     )
GROUP BY YEAR DESC, MONTH DESC;

TO_DATE를 이용해서 BETWEEN 사용

 

중복된 아이다값을 제거하기 위해서 DISTINCT() 삽입

 

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
       COUNT(DISTINCT(USER_ID)) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT(USER_ID)) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD')), 2) AS PURCHASED_RATIO
FROM ONLINE_SALE
WHERE USER_ID IN (SELECT USER_ID FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD'))
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'),TO_CHAR(SALES_DATE, 'MM')
ORDER BY YEAR DESC , MONTH DESC;

 

중복되는 서브쿼리 제거

BUY_FULL_USR때문에 서브쿼리를 썻으나 그렇게하면 서브쿼리안에 있는 값이 이상하게 됨

 

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
       COUNT(DISTINCT(USER_ID)) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT(USER_ID)) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD')), 2) AS PURCHASED_RATIO
FROM ONLINE_SALE
WHERE USER_ID IN (SELECT USER_ID FROM USER_INFO WHERE SALES_DATE BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD'))
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'),TO_CHAR(SALES_DATE, 'MM')
ORDER BY YEAR DESC , MONTH DESC;

 


Solution✍

 

SELECT TO_CHAR(SALES_DATE, 'YYYY') AS YEAR,
       TO_NUMBER(TO_CHAR(SALES_DATE, 'MM')) AS MONTH,
       COUNT(DISTINCT(USER_ID)) AS PURCHASED_USERS,
       ROUND(COUNT(DISTINCT(USER_ID)) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE JOINED BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD')), 1) AS PURCHASED_RATIO
FROM ONLINE_SALE
WHERE USER_ID IN (SELECT USER_ID FROM USER_INFO WHERE JOINED BETWEEN TO_DATE('2021-01-01', 'YYYY-MM-DD') AND TO_DATE('2021-12-31', 'YYYY-MM-DD'))
GROUP BY TO_CHAR(SALES_DATE, 'YYYY'),TO_CHAR(SALES_DATE, 'MM')
ORDER BY YEAR,MONTH;

문제는 오름차순인데 내림차순으로 적음... 왜 안되지 했음... 

그리고 ROUN1로 해야지 소수점 두번째 자리에서 반올림^^...


 

Review🤩

들여쓰기 이쁘게 안되는건 별로네... 티스토리 이상해요


 

 

+ Recent posts