`복습하기`
문제 1. 상품을 구매한 회원 비율 구하기
USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
💡 문제 풀이
`내 풀이`
SELECT YEAR(SALES_DATE) AS YEAR,
MONTH(SALES_DATE) AS MONTH,
COUNT(DISTINCT USER_ID) AS PURCHASED_USERS,
ROUND(COUNT(DISTINCT USER_ID) / (SELECT COUNT(USER_ID) FROM USER_INFO WHERE YEAR(JOINED)='2021'),1) AS PUCHASED_RATIO
FROM ONLINE_SALE
LEFT JOIN USER_INFO USING(USER_ID)
WHERE YEAR(JOINED)='2021'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
`오답노트`
- 우선 문제를 잘못 이해해서 시간을 엄청나게 날림. 연,월이 가입일자 기준인 줄 알았는데 판매 데이터 기준이었음.
- 두번째로는 PURCHASED_RATIO를 구할 때 COUNT(DISTINCT USER_ID)/ COUNT(USER_ID)로 했어서 오답이 나옴. 이미 LEFT JOIN이 되어있기 때문에 USER_ID의 숫자가 sales 숫자로 나오기 때문에 user 수를 구하려고 select문 사용함
`다른 풀이`
ELECT YEAR(B.SALES_DATE) YEAR,
MONTH(B.SALES_DATE) MONTH,
COUNT(DISTINCT(B.USER_ID)) PURCHASED_USERS,
ROUND(COUNT(DISTINCT(B.USER_ID))/C.CNT, 1) PUCHASED_RATIO
FROM USER_INFO A, ONLINE_SALE B, (SELECT COUNT(*) CNT
FROM USER_INFO
WHERE YEAR(JOINED) = 2021) C
WHERE 1=1
AND A.USER_ID = B.USER_ID
AND YEAR(A.JOINED) = 2021
GROUP BY YEAR(B.SALES_DATE) , MONTH(B.SALES_DATE)
ORDER BY YEAR(B.SALES_DATE) , MONTH(B.SALES_DATE)
;
- 다른 사람 풀이 보니 이런 풀이도 있었다. FROM에 테이블을 나열하고 WHERE 1=1 을 쓰는 방식이 특이해서 가져옴
- WHERE 1=1의 사용
- 아무 의미없는 조건을 넣고 그 아래 AND로 조건을 추가함. 아래와 같이 주석처리해서 디버깅하기 쉬움.
WHERE 1=1
-- AND A.USER_ID = B.USER_ID
AND YEAR(A.JOINED) = 2021