나 개발자 진짜 되냐?

[ SQL_JOIN / 서브쿼리 / ROUND / YEAR ] 상품을 구매한 회원 비율 구하기 - 깊은 해석 본문

SQL을 해보았어요!

[ SQL_JOIN / 서브쿼리 / ROUND / YEAR ] 상품을 구매한 회원 비율 구하기 - 깊은 해석

Snow Rabbit 2023. 1. 6. 19:57

후후후ㅜ후..

굉장히 어려운 문제였어요..

 

결국 답지를 찾아봤지만

그냥 조인으로 끝낼 문제가 아니라

서브쿼리 까지 활용했어야하는 문제였다.

 

처음에는 답을 보고도 이해하지 못했기 때문에...

이 글을 읽는 그대는

내 글을 보고 해석이 되었으면 좋겠다.

 

SELECT  YEAR, MONTH,  COUNT(*) AS PUCHASED_USERS,

먼저 문제에서 보다시피

2021에 가입된 사람들 중 구매한 회원수, 구매한 회원의 비율, 년, 월 이렇게 4개를 적는다.

 

맨 위에 SELECT 에 적은 YEAR, MONTH는

음..AS 뒤에오는 변수라고 생각해도 된다.

회원 수 이기 때문에 일단 COUNT를 써주고 전체로 묶어준다. 

전체로 묶어주는 이유는 FROM에서 서브쿼리로 조인해주면

그 값을 세어주기만 하면 되기 때문이다. 

 

문제에서 소수점 둘째까지라고 했기 때문에 1 을써주고

.ROUND((들어갈 숫자),1) 를 써준다.

 

 ROUND((COUNT(*) (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = 2021)), 1

여기서 우리가 주목해야하는 점은 슬래쉬 뒤에 위치한 부분이다.

서브쿼리로 분모를 정확히 짚어줘야한다.

USER_INFO에서 JOINED이 2021인 애들을 카운트 해준다.

 

그 다음 FROM에서 서브쿼리로 JOIN을 해준다.

 

FROM (
SELECT DISTINCT  YEAR(O.SALES_DATE) AS YEAR, MONTH(O.SALES_DATE) AS MONTH, U.USER_ID
    FROM ONLINE_SALE O JOIN USER_INFO U ON O.USER_ID = U.USER_ID
    WHERE YEAR(JOINED) = 2021
) A

우선 YEAR과 MONTH를 재정의 해준다.

우리는 SALES_DATE를 출력해줘야하기 때문이다. 

 

여기서

YEAR에 중복제거(DISTINCT)를 하는 이유가 정말 어려웠다.

일단 떠오를거같지도 않지만..

이걸 빼면 오류가 생기더라. 이런 예상도 해야한다는 생각에..손이 덜덜덜덜이었다.

 

하는 이유는!

만약 한 사람이 같은 날 두개의 물건을 사게되면 
SALES_DATE에 값이 두 개 찍히게 된다. 그렇게 되면 PUCHASED_USERS 값이 커지게 되고 그렇게 분자 값이 커지게 되면서 PUCHASED_USERS 값이 변하게 된다. 그러면 맨 위에 서브쿼리에서  RATIO 값도 달라지게 된다. 

 

GROUP BY YEAR, MONTH 
ORDER BY YEAR, MONTH

 

나는 왜 GROUP를 해주어야하나..싶었는데

제일 마지막줄에 "년, 월 별로 상품을..." 이라는 글을 보고

묶게 되었다..ㅎㅎ

 

어렵다...어려워