๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ
์คํธ ์ฐ์ต,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์์ ๋ฐํ๋๋ค.
โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ํ ์์ ์์ ํ๋งค์ค์ธ ๋์๋ค์ ๋์ ์ ๋ณด(BOOK), ์ ์ ์ ๋ณด(AUTHOR) ํ ์ด๋ธ์ ๋๋ค.
BOOK ํ ์ด๋ธ์ ๊ฐ ๋์์ ์ ๋ณด๋ฅผ ๋ด์ ํ ์ด๋ธ๋ก ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ต๋๋ค.
Column name | Type | Nullable | Description |
BOOK_ID | INTEGER | FALSE | ๋์ ID |
CATEGORY | VARCHAR(N) | FALSE | ์นดํ ๊ณ ๋ฆฌ (๊ฒฝ์ , ์ธ๋ฌธ, ์์ค, ์ํ, ๊ธฐ์ ) |
AUTHOR_ID | INTEGER | FALSE | ์ ์ ID |
PRICE | INTEGER | FALSE | ํ๋งค๊ฐ (์) |
PUBLISHED_DATE | DATE | FALSE | ์ถํ์ผ |
AUTHOR ํ ์ด๋ธ์ ๋์์ ์ ์์ ์ ๋ณด๋ฅผ ๋ด์ ํ ์ด๋ธ๋ก ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ต๋๋ค.
Column name | Type | Nullable | Description |
AUTHOR_ID | INTEGER | FALSE | ์ ์ ID |
AUTHOR_NAME | VARCHAR(N) | FALSE | ์ ์๋ช |
BOOK_SALES ํ ์ด๋ธ์ ๊ฐ ๋์์ ๋ ์ง ๋ณ ํ๋งค๋ ์ ๋ณด๋ฅผ ๋ด์ ํ ์ด๋ธ๋ก ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ต๋๋ค.
Column name | Type | Nullable | Description |
BOOK_ID | INTEGER | FALSE | ๋์ ID |
SALES_DATE | DATE | FALSE | ํ๋งค์ผ |
SALES | INTEGER | FALSE | ํ๋งค๋ |
๋ฌธ์
2022๋ 1์์ ๋์ ํ๋งค ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ์ ๋ณ, ์นดํ ๊ณ ๋ฆฌ ๋ณ ๋งค์ถ์ก(TOTAL_SALES = ํ๋งค๋ * ํ๋งค๊ฐ) ์ ๊ตฌํ์ฌ, ์ ์ ID(AUTHOR_ID), ์ ์๋ช (AUTHOR_NAME), ์นดํ ๊ณ ๋ฆฌ(CATEGORY), ๋งค์ถ์ก(SALES) ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ์ ์ ID๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก, ์ ์ ID๊ฐ ๊ฐ๋ค๋ฉด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
โ 2022๋ 1์์ ๋์ ํ๋งค ๋ฐ์ดํฐ๋ฅผ ๊ธฐ์ค์ผ๋ก > WHERE ์กฐ๊ฑด1
โก ์ ์๋ณ¹, ์นดํ ๊ณ ๋ฆฌ๋ณ² , ๋งค์ถ์ก(TOTAL_SALES = ํ๋งค๋ * ํ๋งค๊ฐ) > ๊ทธ๋ฃน์กฐ๊ฑด 1, 2 → ์ง๊ณํจ์
+ ์ปฌ๋ผ ๊ฐ ์ฐ์ฐ (ํ๋งค๋ × ํ๋งค๊ฐ)
โข ์ ์ ID(AUTHOR_ID), ์ ์๋ช (AUTHOR_NAME), ์นดํ ๊ณ ๋ฆฌ(CATEGORY), ๋งค์ถ์ก(SALES) ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅ
> โ , โก ์ํ ์ BOOK, AUTHOR, BOOK_SALES ํ ์ด๋ธ ๊ฐ ์กฐ์ธํด์ผ WHERE์ ์กฐ๊ฑด, ๊ทธ๋ฃนํ, ํ ์ด๋ธ ์ปฌ๋ผ๊ฐ ์ฐ์ฌ์ด๊ฐ๋ฅํ๋ค.
์ ์ ID๋ฅผ ์ค๋ฆ์ฐจ์¹์ผ๋ก, ์ ์ ID๊ฐ ๊ฐ๋ค๋ฉด ์นดํ ๊ณ ๋ฆฌ๋ฅผ ๋ด๋ฆผ์ฐจ์² ์ ๋ ฌ > ์ ๋ ฌ์กฐ๊ฑด1, 2
SELECT BO.AUTHOR_ID, AU.AUTHOR_NAME, BO.CATEGORY, SUM(BS.SALES * PRICE) AS TOTAL_SALES
FROM BOOK BO
INNER JOIN AUTHOR AU
ON BO.AUTHOR_ID = AU.AUTHOR_ID -- BOOK ํ
์ด๋ธ๊ณผ AUTHOR ํ
์ด๋ธ ์กฐ์ธ
INNER JOIN BOOK_SALES BS
ON BO.BOOK_ID = BS.BOOK_ID -- BOOK_SALES ํ
์ด๋ธ๊ณผ BOOK ํ
์ด๋ธ ์กฐ์ธ
WHERE DATE_FORMAT(BS.SALES_DATE, '%Y-%m-%d') LIKE '2022-01-%' -- ํ๋งค์ 22๋
1์ ํ์ ์กฐ๊ฑด ๋ถ์ฌ
GROUP BY 2, 3 -- ์ ์๋ณ, ์นดํ
๊ณ ๋ฆฌ๋ณ ๊ทธ๋ฃนํ
ORDER BY 1, 3 DESC -- ์ ์ ID๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก,
-- ์ ์ ID๊ฐ ๊ฐ๋ค๋ฉด ์นดํ
๊ณ ๋ฆฌ๋ฅผ ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
โ ์ฌํ์ด (2023.06.13)
์ฌํ์ด์์๋ BOOK_SALES ํ ์ด๋ธ์์ 2022-01 ํ๋งค๋๋ง ๊ณ ๋ คํ๋ ๋งํผ
ํ ์ด๋ธ ๊ฐ ์กฐ์ธ ์ ์ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํด์ B3๋ก ์กฐ์ธํ๋ค.
SELECT B2.AUTHOR_ID, B2.AUTHOR_NAME, B1.CATEGORY, SUM(B1.PRICE * B3.SALES) AS TOTAL_SALES
FROM BOOK B1
LEFT JOIN AUTHOR B2
ON B1.AUTHOR_ID = B2.AUTHOR_ID
INNER JOIN (SELECT * FROM BOOK_SALES
WHERE DATE_FORMAT(SALES_DATE, '%Y-%m')='2022-01') B3
ON B1.BOOK_ID = B3.BOOK_ID
GROUP BY 1, 3
ORDER BY 1, 3 DESC;