๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ
์คํธ ์ฐ์ต,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์์ ๋ฐํ๋๋ค.
โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋ฅ ์ผํ๋ชฐ์ ๊ฐ์ ํ ํ์ ์ ๋ณด๋ฅผ ๋ด์ USER_INFO ํ ์ด๋ธ๊ณผ ์จ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ ONLINE_ SALE ํ ์ด๋ธ ์ ๋๋ค.
USER_INFO ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์๋ฉฐ USER_ID, GENDER, AGE, JOINED๋ ๊ฐ๊ฐ ํ์ ID, ์ฑ๋ณ, ๋์ด, ๊ฐ์ ์ผ์ ๋ํ๋ ๋๋ค.
Column name | Type | Nullable |
USER_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 name | Type | Nullable |
ONLINE_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๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ํ์ ๊ตฌ๋งคํ ํ์์ ๋น์จ์ ์์์ ๋๋ฒ์งธ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ๊ณ , ์ ์ฒด ๊ฒฐ๊ณผ๋ ๋ ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ ๋ ์ด ๊ฐ๋ค๋ฉด ์์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
USER_INFO ํ ์ด๋ธ๊ณผ ONLINE_SALE ํ ์ด๋ธ์์
2021๋ ์ ๊ฐ์ ํ ์ ์ฒด ํ์๋ค ์ค ์ํ์ ๊ตฌ๋งคํ ํ์์์ ์ํ์ ๊ตฌ๋งคํ ํ์์ ๋น์จ
(=2021๋ ์ ๊ฐ์ ํ ํ์ ์ค ์ํ์ ๊ตฌ๋งคํ ํ์์ / 2021๋ ์ ๊ฐ์ ํ ์ ์ฒด ํ์ ์)์ ๋ , ์ ๋ณ๋ก ์ถ๋ ฅ
> ๋น์จ์ ๋ถ๋ชจ, ๋ถ์ ๋ฐ์ดํฐ ์๋์ ๋ชจ๋ '2021๋ ์ ๊ฐ์ ํ' ํ์์ด๋ผ๋ ์กฐ๊ฑด์ด ๋ถ์ฌ๋์๋ค.
์ด ์กฐ๊ฑด์ ์ฟผ๋ฆฌ๋ก ์ ํ์ด๋ด๋ ๊ฒ์ด ์ค์ํ๋ค.
<๋ถ๋ชจ> ๋ (2021๋ ๊ฐ์ ์์ด๋ฉด์) ONLINE_SALE ํ ์ด๋ธ์์ 2021๋ ๊ตฌ๋งค ํ์์ ์๋ฅผ ์ถ์ถํด์ผํ๊ณ
<๋ถ์> ๋ USER_INFO ํ ์ด๋ธ์์ 2021๋ ๊ฐ์ ํ์์ ์๋ฅผ ์ถ์ถ.
> ์ฟผ๋ฆฌ ์คํ ์์๋ฅผ ์๊ฐํ์ ๋, ONLINE_SALE ํ ์ด๋ธ ๋ฐ์ดํฐ์์ USER_INFO์์ 2021๋ ๊ฐ์ ํ์๋ง์ ๋์์ผ๋ก ํ ์ด๋ธ ๋ฐ์ดํฐ๋ฅผ ๊ตฌํ๊ธฐ ์ํด USER_INFO ํ ์ด๋ธ์ JOINED ๋ ์ง ๊ธฐ๊ฐ ์กฐ๊ฑด + INNER JOIN ์ ์ฉ
> WHERE์ ์ ๊ฐ์ ์๊ธฐ ์กฐ๊ฑด์ ์ด์ ์ ํ์๋ ๋ฌธ์ ์ฒ๋ผ DATE_FORMAT() ์๋ BETWEEN ~ AND ๋ฌธ๋ฒ ์ฌ์ฉ
> ๋ถ๋ชจ์ USER_INFO ํ ์ด๋ธ์ ๋์์ผ๋ก 2021๋ ๊ฐ์ ์ ์๋ง ๋ฝ์์ฃผ๋ ์๋ธ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ ๊ฒ์ด ํ์ด์ ์ ์ผ ์์์ ์ด ๋์๋ ๊ฒ ๊ฐ๋ค.
์ํ์ ๊ตฌ๋งคํ ํ์์ ๋น์จ์ ์์์ ๋๋ฒ์งธ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผ > SELECT์ ์์ ROUND() ํจ์ ์ฌ์ฉ
์ ์ฒด ๊ฒฐ๊ณผ๋ ๋ ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ > ์ ๋ ฌ์กฐ๊ฑด 1
๋ ์ด ๊ฐ๋ค๋ฉด ์์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ > ์ ๋ ฌ์กฐ๊ฑด 2
SELECT DATE_FORMAT(OS.SALES_DATE, '%Y') YEAR,
DATE_FORMAT(OS.SALES_DATE, '%m') MONTH,
COUNT(DISTINCT OS.USER_ID) PUCHASED_USERS
,ROUND(COUNT(DISTINCT OS.USER_ID) / (SELECT COUNT(DISTINCT USER_ID)
FROM USER_INFO
WHERE JOINED BETWEEN '2021-01-01 00:00:00'
AND '2021-12-31 23:59:59'), 1) PUCHASED_RATIO
FROM ONLINE_SALE OS
INNER JOIN (SELECT USER_ID, JOINED
FROM USER_INFO
WHERE JOINED BETWEEN '2021-01-01 00:00:00' AND '2021-12-31 23:59:59') UI
ON OS.USER_ID = UI.USER_ID
GROUP BY 1, 2
ORDER BY 1, 2
โ ์ถ๊ฐ : ๋ ์งํจ์ ํ์ฉํด์ ์ฝ๋ ๊ฐ๋จํ ํ๊ธฐ (2023.06.13 ํ์ด)
SELECT YEAR(OS.SALES_DATE) AS YEAR
,MONTH(OS.SALES_DATE) AS MONTH
,COUNT(DISTINCT OS.USER_ID) AS PUCHASED_USERS
,ROUND((COUNT(DISTINCT OS.USER_ID) / (SELECT COUNT(DISTINCT USER_ID)
FROM USER_INFO
WHERE YEAR(JOINED) = '2021')), 1) AS PUCHASED_RATIO
FROM ONLINE_SALE OS
JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID AND YEAR(UI.JOINED) = '2021'
GROUP BY 1, 2
ORDER BY 1, 2;
์ถ๊ฐ ํ์ด์์๋ ์กฐ์ธํ ํ ์ด๋ธ์ user_info์์ ๊ฐ์ ธ์ฌ ๋ ๊ฐ์ ๋ ๋ = 2021 ์กฐ๊ฑด์ ๊ฑธ์ด์ฃผ๋ ๋์
์กฐ์ธ ๊ณผ์ ์์ ๊ฐ์ ๋ ๋๊ฐ 2021๋ ์ธ user์ user_id๋ง ์กฐ์ธ๋๋๋ก ํด๋ดค๋ค.