본문 바로가기
Stay Hungry Stay Foolish/SQL

[MYSQL] 상품을 구매한 회원 비율 구하기

by HANNI하니 2023. 10. 4.

사용 언어 - MYSQL

프로그래머스 LV 4) 상품을 구매한 회원 비율 구하기

 

프로그래머스

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

programmers.co.kr

 

정답

분모, 분자 특징 찾기 + DISTINCT (정답 맞춘 여부 X

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

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

= 상품을 여러 개 구매한 회원이 있을 수 있으므로 중복 제거 필수! DISTINCT

= COUNT(*)를 하기 위해 ONLINE_SALE를 기준으로 JOIN

 

분모 = 2021년에 가입한 전체 회원 수

= USER_INFO 테이블로 아예 새로운 조건 필요

= SELECT 절에서 COUNT(*)로 따로 구해야함

 

+ FROM 절 안에 서브쿼리문으로 구할 땐, 해당 테이블의 이름/별칭이 무조건 있어야 한다!

FROM (SELECT ~ FROM ~ JOIN ~ ON) AS A <- 별칭 지정 안하면 오류 생김

SQL 실행 중 오류가 발생하였습니다. Every derived table must have its own alias

SELECT YEAR, MONTH, COUNT(*) AS PUCHASED_USERS,
	ROUND((COUNT(*)/
           (SELECT COUNT(*)
            FROM USER_INFO WHERE YEAR(JOINED) = 2021))
          ,1) AS PUCHASED_RATIO
FROM (
    SELECT DISTINCT YEAR(S.SALES_DATE) AS YEAR, MONTH(S.SALES_DATE) AS MONTH, U.USER_ID
    FROM ONLINE_SALE S
    JOIN USER_INFO U
    ON S.USER_ID = U.USER_ID AND YEAR(JOINED) = 2021
) AS A
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH

 

 

처음에 시도했던 방식 - 틀린 부분 정리

1. YEAR(JOINED)는 숫자열이라 '' 필요 없음

2. 서브쿼리 안의 COUNT(*) AS C 의 경우, 각 USER_ID마다의 COUNT라 의미 없음

# 내 오답
SELECT YEAR(A.SALES_DATE) AS YEAR, MONTH(A.SALES_DATE) AS MONTH, 
COUNT(*) AS PURCHASED_USERS, ROUND(COUNT(*)/C,2) AS PURCHASED_RATIO
FROM ONLINE_SALE AS A
LEFT JOIN (SELECT USER_ID, COUNT(*) AS C
                 FROM USER_INFO
                 WHERE YEAR(JOINED) = '2021'
                ) AS B
ON A.USER_ID = B.USER_ID
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;

 

 

 

 

 

레퍼런스

  • 정답 깃허브

https://github.com/yyeongeun/codingtest/blob/main/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4%20MYSQL/%EC%83%81%ED%92%88%EC%9D%84%EA%B5%AC%EB%A7%A4%ED%95%9C%ED%9A%8C%EC%9B%90%EB%B9%84%EC%9C%A8%EA%B5%AC%ED%95%98%EA%B8%B0.sql

 

댓글