๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ
์คํธ ์ฐ์ต,
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 ํ ์ด๋ธ์์ ๋ , ์, ์ฑ๋ณ ๋ณ๋ก ์ํ์ ๊ตฌ๋งคํ ํ์์๋ฅผ ์ง๊ณํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ๋ , ์, ์ฑ๋ณ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์. ์ด๋, ์ฑ๋ณ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ์์ ์ ์ธํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
USER_INFO ํ ์ด๋ธ๊ณผ ONLINE_SALE ํ ์ด๋ธ์์ ๋ , ์, ์ฑ๋ณ ๋ณ๋ก ์ํ์ ๊ตฌ๋งคํ ํ์์๋ฅผ ์ง๊ณ*
> USER_INFO ํ ์ด๋ธ๊ณผ ONLINE_SALE ํ ์ด๋ธ ๊ณตํต์ปฌ๋ผ USER_ID๋ก ์กฐ์ธ
> (๋ , ์, ์ฑ๋ณ ๋ณ๋ก) ๊ทธ๋ฃน์กฐ๊ฑด1, 2, 3
๊ฒฐ๊ณผ๋ ๋ , ์, ์ฑ๋ณ์ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ > ์ ๋ ฌ์กฐ๊ฑด1
์ด๋, ์ฑ๋ณ ์ ๋ณด๊ฐ ์๋ ๊ฒฝ์ฐ ๊ฒฐ๊ณผ์์ ์ ์ธ > WHERE์กฐ๊ฑด
* ์ ์ํด์ผ ํ ์
๊ตฌ๋งค ๊ฑด์๋ฅผ ์ง๊ณํ๋ ๊ฒ์ด ์๋ ํ์์ ์ด๋ฏ๋ก
๋ฌธ์ ์กฐ๊ฑด์ [๋์ผํ ๋ ์ง, ํ์ ID, ์ํ ID ์กฐํฉ์ ๋ํด์๋ ํ๋์ ํ๋งค ๋ฐ์ดํฐ๋ง ์กด์ฌํฉ๋๋ค.] ๋ผ๋ ์กฐ๊ฑด์๋ ํน์ ๋ ์ง ๋ด ํ์ 1๋ช ์ด ์ฌ๋ฌ๊ฐ์ง ์ํ์ ๊ตฌ๋งคํ์ ์ ์์ผ๋ฏ๋ก USER_ID ์ง๊ณ์ ์ค๋ณต ์ ๊ฑฐ(DISTINCT)๋ฅผ ํด์ค์ผ ํ๋ค.
SELECT DATE_FORMAT(SALES_DATE, '%Y') AS YEAR,
DATE_FORMAT(SALES_DATE, '%m') AS MONTH,
UI.GENDER,
COUNT(DISTINCT OS.USER_ID) USERS
FROM ONLINE_SALE OS
LEFT JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3
โ ๋ ์ง ํจ์(YEAR, MONTH) ํ์ฉํ ํ์ด (2023.06.13 ์ถ๊ฐ)
SELECT YEAR(SALES_DATE) AS YEAR
,MONTH(SALES_DATE) AS MONTH
,GENDER
,COUNT(DISTINCT OS.USER_ID) AS USERS
FROM ONLINE_SALE OS
LEFT JOIN USER_INFO UI
ON OS.USER_ID = UI.USER_ID
WHERE UI.GENDER IS NOT NULL
GROUP BY 1, 2, 3
ORDER BY 1, 2, 3;