링크: https://school.programmers.co.kr/learn/courses/30/lessons/131534
습득한 점:
1. 문제를 읽고, 내가 이해한 플로우가 맞는지 예시로 나온 부분도 제대로 파악하기!!!
이 문제의 경우 PUCHASED_USERS 를 구하는 과정에서 중복값을 고려하지 않아서 한참을 헤멧다.
읽기만 하고 문제가 원하는 바를 제대로 이해하지 않음.
PUCHASED_USERS 컬럼의 경우 중복을 제거한 숫자를 카운팅하는 점을 주의해야함.
(예시까지 이해하지 않으면, 계속 틀리게 될 것 같다)
2. JOIN의 경우 INNER JOIN으로 자동 인식된다는 점
3. 테이블 조인할 때, AND조건으로 조인될 조건을 추가할 수 있음.
INNER JOIN USER_INFO U ON S.USER_ID = U.USER_ID AND YEAR(JOINED) = 2021
ONLINE_SALE 테이블의 JOINED 의 연도가 2021인 경우에만 테이블 조인 할 것.
- Reference
https://extbrain.tistory.com/60
***추가 - 날짜데이터에서 일부 데이터만 추출하기
- YEAR : 연도 추출
- MONTH : 월 추출
- DAY : 일 추출 (DAYOFMONTH와 같은 함수)
- DATE : 년 / 월 / 일 추출 (DATETIME 형식 -> DATE 형식)
- HOUR : 시 추출
- MINUTE : 분 추출
- SECOND : 초 추출
문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서
2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율
(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성
상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림
전체 결과는 년을 기준으로 오름차순 정렬
년이 같다면 월을 기준으로 오름차순 정렬
문제 파악
# USER_INFO (회원정보)
# - USER_ID, GENDER, AGE, JOINED
# ONLINE_SALE (온라인 상품 판매정보)
# - ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE
# foreign key - USER_ID
# 특이사항 - 판매일이 DATETIME 형식, 성별이 1,2,null 로 구분
형식 :
# YEAR MONTH PUCHASED_USERS PUCHASED_RATIO
풀이
SELECT YEAR,
MONTH,
COUNT(*) AS PUCHASED_USERS,
-- COUNT(*) = 상품구매 회원 수
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
INNER JOIN USER_INFO U ON S.USER_ID = U.USER_ID AND YEAR(JOINED) = 2021 -- JOINED 의 연도가 2021인 경우에만 함께 조인
) sub
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
'sql > 다시풀기' 카테고리의 다른 글
프로그래머스 Lv 4 - 자동차 대여 기록 별 대여 금액 구하기 (0) | 2023.06.28 |
---|