일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- 다이나믹프로그래밍
- 스택
- 빅데이터
- Queue
- DP
- 구현
- 문자열
- 다리 만들기
- HashMap
- 아스키코드
- SQL
- 그리디
- 알고리즘
- 배열
- dfs
- 완전탐색
- 백트래킹
- 탐색
- BFS
- LIS
- Stack
- 브루트포스
- oracle
- 프로그래머스
- BufferedReader
- 백준
- Python
- 새벽코딩
- 시뮬레이션
- Java
- Today
- Total
새벽코딩
[프로그래머스] [Level 5] 상품을 구매한 회원비율 구하기 (ORACLE) 본문
https://school.programmers.co.kr/learn/courses/30/lessons/131534?language=oracle
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
상품을 구매한 회원 비율 구하기
다음은 어느 의류 쇼핑몰에 가입한 회원 정보를 담은 USER_INFO 테이블과 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블 입니다. USER_INFO 테이블은 아래와 같은 구조로 되어있으며 USER_ID, GENDER, AGE, JOINED는 각각 회원 ID, 성별, 나이, 가입일을 나타냅니다.
Column nameTypeNullableUSER_ID | INTEGER | FALSE |
GENDER | TINYINT(1) | TRUE |
AGE | INTEGER | TRUE |
JOINED | DATE | FALSE |
GENDER 컬럼은 비어있거나 0 또는 1의 값을 가지며 0인 경우 남자를, 1인 경우는 여자를 나타냅니다.
ONLINE_SALE 테이블은 아래와 같은 구조로 되어있으며 ONLINE_SALE_ID, USER_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE는 각각 온라인 상품 판매 ID, 회원 ID, 상품 ID, 판매량, 판매일을 나타냅니다.
Column nameTypeNullableONLINE_SALE_ID | INTEGER | FALSE |
USER_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
동일한 날짜, 회원 ID, 상품 ID 조합에 대해서는 하나의 판매 데이터만 존재합니다.
문제
USER_INFO 테이블과 ONLINE_SALE 테이블에서 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수와 상품을 구매한 회원의 비율(=2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수)을 년, 월 별로 출력하는 SQL문을 작성해주세요. 상품을 구매한 회원의 비율은 소수점 두번째자리에서 반올림하고, 전체 결과는 년을 기준으로 오름차순 정렬해주시고 년이 같다면 월을 기준으로 오름차순 정렬해주세요.
※ SQL 소스 (상품을 구매한 회원비율 구하기)
- 코드를 입력하세요
SELECT
YEAR
, MONTH
, COUNT(DISTINCT USER_ID) AS PURCHASED_USERS
, ROUND(COUNT(DISTINCT USER_ID) / (SELECT COUNT(*)
FROM USER_INFO
WHERE EXTRACT(YEAR FROM JOINED) = 2021
), 1) AS PURCHASED_RATIO
FROM
(
SELECT
EXTRACT(YEAR FROM SALES_DATE) AS YEAR
, EXTRACT(MONTH FROM SALES_DATE) AS MONTH
, UI.USER_ID AS USER_ID
FROM USER_INFO UI
INNER JOIN ONLINE_SALE OS
ON UI.USER_ID = OS.USER_ID
AND EXTRACT(YEAR FROM JOINED) = 2021
) RESULT
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH
※ 생각정리
1. 연도와 달을 따로 뽑아오기위해서 EXTRACT() 함수를 사용하였다.
2. 현재 유저의 총 수를 뽑기위해 전체 유저 리스트를 내부쿼리에서 가져와 DISTINCT로 중복을 제거한 후 수를 구하였다.
3. 2째자리에서 반올림하기 위해 ROUND() 함수를 사용하였고, 처음에는 TO_CHAR('실수값', 'FM9990.09')와 같이 소수점앞에 0을 붙이는 문자열 처리를 해주었지만 이렇게 하면 틀리다는 결과가 나와서 사용하지 않으니 정답을 얻을 수 있었다.
다음에는 WITH절로 내부쿼리를 빼주어 본 쿼리를 좀 간단하게 만들어볼 생각이다.
-새벽코딩-
'알고리즘' 카테고리의 다른 글
[프로그래머스] 무인도 여행 (BFS) (JAVA) (0) | 2023.03.04 |
---|---|
[프로그래머스] [Level2] 미로 탈출 (BFS) (JAVA) (0) | 2023.02.22 |
[백준] [18310] 안테나 (JAVA) (0) | 2023.02.18 |
[백준] [1699] 제곱수의 합 (dp) (JAVA) (0) | 2023.02.13 |
[백준] [1343] 폴리오미노 (그리디) (JAVA) (0) | 2023.02.11 |