๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋ฅ ์ผํ๋ชฐ์ ๊ฐ์ ํ ํ์ ์ ๋ณด๋ฅผ ๋ด์ USER_INFO ํ ์ด๋ธ๊ณผ ์จ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ ONLINE_SALE ํ ์ด๋ธ ์ ๋๋ค. USER_INFO ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ USER_ID, GENDER, AGE, JOINED๋ ๊ฐ๊ฐ ํ์ ID, ์ฑ๋ณ, ๋์ด, ๊ฐ์ ์ผ์ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
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 nameTypeNullable
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๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ํ์ ๊ตฌ๋งคํ ํ์์ ๋น์จ์ ์์์ ๋๋ฒ์งธ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํ๊ณ , ์ ์ฒด ๊ฒฐ๊ณผ๋ ๋ ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ ๋ ์ด ๊ฐ๋ค๋ฉด ์์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
๋ฌธ์ ํ์ด
SELECT YEAR, MONTH, COUNT(*),
ROUND(COUNT(*)/(SELECT COUNT(*) FROM USER_INFO WHERE YEAR(JOINED)=2021),1) AS RATIO
FROM (SELECT DISTINCT YEAR(SALES_DATE)
AS YEAR, MONTH(SALES_DATE) AS MONTH, S.USER_ID
FROM ONLINE_SALE AS S
JOIN USER_INFO AS U
ON S.USER_ID=U.USER_ID
AND YEAR(JOINED)=2021) SALE_USER
GROUP BY YEAR, MONTH
ORDER BY YEAR, MONTH;
- 2021๋ ์ ๊ฐ์ ํ ํ์๋ค์ ๊ตฌ๋งค ์ด๋ ฅ์ ์กฐํํ ๋ฐ์ดํฐ๋ฅผ ์๋ธ์ฟผ๋ฆฌ๋ก ์ฌ์ฉํ๋ค.
- ์ ์ฒด ํ์๋ค์ ๊ตฌ๋งค ์ด๋ ฅ์ด ์ ์ฅ๋ ONLINE_SALE ํ ์ด๋ธ๊ณผ ํ์ ์ ๋ณด๊ฐ ์ ์ฅ๋ USER_INFO ํ ์ด๋ธ์ USER_ID๋ฅผ ๊ธฐ์ค์ผ๋ก JOINํ๊ณ , YEAR(JOINED)=2021์ธ ํ์๋ค ์ฆ, 2021๋ ์ ๊ฐ์ ํ ํ์๋ค์ ๊ตฌ๋งค ๋ , ๊ตฌ๋งค ์, ํ์ ์์ด๋ ์ปฌ๋ผ์ ์ถ์ถํ๋ค.
- ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ ๊ฐ์ ๋ , ๊ฐ์ ์์ ๊ตฌ๋งค๋ฅผ ๋ ๋ฒ ํ ํ์์ด ์์ ์ ์๊ธฐ ๋๋ฌธ์ DISTINCT๋ฅผ ์ด์ฉํด์ ์ค๋ณต ์ ๊ฑฐ๋ฅผ ํด์ค๋ค.
- ์ด๋ ๊ฒ ์ถ์ถํ ๋ฐ์ดํฐ ํ ์ด๋ธ์ SALE_USER ๋ผ๋ ์ด๋ฆ์ผ๋ก ๋ณ์นญ์ ๋ถ์ฌ์ค๋ค.
- SALE_USER ํ ์ด๋ธ์ ๊ตฌ๋งค ๋ ๊ณผ ๊ตฌ๋งค ์์ ๊ธฐ์ค์ผ๋ก ๊ทธ๋ฃนํํด์ค๋ค.
- SALE_USER ํ ์ด๋ธ์์ ๊ฐ ๊ทธ๋ฃน๋ณ๋ก ๋ (YEAR), ์(MONTH)์ ์ถ์ถํ๊ณ ๊ฐ ๊ทธ๋ฃน์ ๊ฐ์(COUNT(*), ๋ ์๋ณ ์ํ์ ๊ตฌ๋งคํ ํ์ ์)์ ๋ ์๋ณ ์ํ์ ๊ตฌ๋งคํ ํ์์ ๋น์จ(COUNT(*) / (์๋ธ์ฟผ๋ฆฌ : USER_INFO ํ ์ด๋ธ์์ ๊ฐ์ ๋ ์ง๊ฐ 2021๋ ์ธ ํ์์ ์))์ ์ถ์ถํ๋ค.
- ๊ตฌ๋งค ํ์ ๋น์จ์ ์์ ๋๋ฒ์งธ ์๋ฆฌ์์ ๋ฐ์ฌ๋ฆผํด์ผ ํ๋ฏ๋ก ROUND(~, 1) ํํ๋ก ์ถ๋ ฅํ๋ค.
- ๋ง์ง๋ง์ผ๋ก ๊ตฌ๋งค ๋ ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ, ๊ตฌ๋งค ์์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํ์ฌ ์ถ๋ ฅํ๋ค.
level 5์ ๊ฑธ๋ง๊ฒ ๊ฝค ๋ณต์กํ๊ณ ์ด๋ ค์ด ๋ฌธ์ ์๋ค..! ์ด ๋ฌธ์ ๋ฅผ ๋์ผ๋ก ํ๋ก๊ทธ๋๋จธ์ค SQL ๊ณ ๋์ ํคํธ๋ฅผ ๋ชจ๋ ํ์๋คใ ใ