사용 언어 - MYSQL
프로그래머스 LV 4) 상품을 구매한 회원 비율 구하기
정답
분모, 분자 특징 찾기 + 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;
레퍼런스
- 정답 깃허브
'Stay Hungry Stay Foolish > SQL' 카테고리의 다른 글
[MYSQL] 헤비 유저가 소유한 장소 (0) | 2023.10.04 |
---|---|
[MYSQL] 5월 식품들의 총매출 구하기 (1) | 2023.10.04 |
[MYSQL] 주문량이 많은 아이스크림들 조회하기 (0) | 2023.10.04 |
[MYSQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2023.10.04 |
[MYSQL] 그룹별 조건에 맞는 식당 목록 출력하기 (0) | 2023.07.27 |
댓글