상품알고리즘 풀이 방법입니다.
문제(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🤩
들여쓰기 이쁘게 안되는건 별로네... 티스토리 이상해요
'Algorithm' 카테고리의 다른 글
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2023.12.26 |
---|---|
[프로그래머스] 동물 수 구하기 , 중복 제거하기 , 나이 정보가 없는 회원 수 구하기 , 이름에 el이 들어가는 동물 찾기, 가장 비싼 상품 구하기 , NULL 처리하기 , 강원도에 위치한 생상공장 목록 .. (1) | 2023.12.20 |
자바 숫자야구 구현 - 1 (0) | 2023.12.09 |
[프로그래머스] 카펫 (0) | 2023.10.24 |
[프로그래머스] 짝지어 제거하기 (0) | 2023.10.23 |