데이터 놀이터
JOIN - 상품을 구매한 회원 비율 구하기 본문
728x90
1. 문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서
2021년에 가입한 전체 회원들 중
상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을
년, 월 별로 출력하는 SQL문을 작성해주세요.
상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고,
전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/132204
2. 문제 조건
- 2021년에 가입한 전체 회원들 중 -> GROUP BY 전 조건이므로 WHERE
- 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수) -> SELECT 내 수식
- 년, 월 별로 출력 -> GROUP BY
- 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림 -> ROUND( , 1)
- 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬 -> ORDER BY
3. 코드 작성
/*
1. 2021년에 가입한 전체 회원들 중
2. 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력
3. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림
4. 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬
*/
SET @user_count = (SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED) = 2021);
SELECT YEAR(SALE.SALES_DATE) AS YEAR
, MONTH(SALE.SALES_DATE) AS MONTH
, COUNT(DISTINCT(SALE.USER_ID)) AS PUCHASED_USERS
, ROUND(COUNT(DISTINCT(SALE.USER_ID)) / @user_count, 1) AS PUCHASED_RATIO
FROM ONLINE_SALE AS SALE
LEFT JOIN USER_INFO AS USER ON SALE.USER_ID = USER.USER_ID
WHERE YEAR(USER.JOINED) = '2021'
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
4. 회고
- SQL 내에서 변수 설정하는 방법을 배웠다.
- SET @변수이름 = 값 -> 변수 설정
- 조회시 SELECT @변수이름
- LIMIT과 같이 변수를 사용하지 못하는 경우 PREPARE과 EXECUTE를 활용
- 출처 : https://velog.io/@estell/SQL-%EB%B3%80%EC%88%98-%EC%82%AC%EC%9A%A9-2mg8x5tu
- 변수를 사용하기 전 SELECT 문 안에다 SELECT 문을 넣는 방식으로 풀었는데, 이런 경우 조회가 N 제곱 형태로 이루어지기 때문에 매우 비효율적이다.
728x90
'SQL' 카테고리의 다른 글
우유와 요거트가 담긴 장바구니 (0) | 2023.09.03 |
---|---|
JOIN - 보호소에서 중성화한 동물 (0) | 2023.08.29 |
String, Date - 오랜 기간 보호한 동물(2) (0) | 2023.08.28 |
String, Date - 조건에 맞는 사용자 정보 조회하기 (0) | 2023.08.28 |
String, Date - 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기 (0) | 2023.08.26 |