[ํ๋ก๊ทธ๋๋จธ์ค] 5์ ์ํ๋ค์ ์ด๋งค์ถ ์กฐํํ๊ธฐ
๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ
์คํธ ์ฐ์ต,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์์ ๋ฐํ๋๋ค.
โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ค์์ ์ํ์ ์ ๋ณด๋ฅผ ๋ด์ FOOD_PRODUCT ํ ์ด๋ธ๊ณผ ์ํ์ ์ฃผ๋ฌธ ์ ๋ณด๋ฅผ ๋ด์ FOOD_ORDER ํ ์ด๋ธ์ ๋๋ค. FOOD_PRODUCT ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ PRODUCT_ID, PRODUCT_NAME, PRODUCT_CD, CATEGORY, PRICE๋ ์ํ ID, ์ํ ์ด๋ฆ, ์ํ์ฝ๋, ์ํ๋ถ๋ฅ, ์ํ ๊ฐ๊ฒฉ์ ์๋ฏธํฉ๋๋ค.
Column name | Type | Nullable |
PRODUCT_ID | VARCHAR(10) | FALSE |
PRODUCT_NAME | VARCHAR(50) | FALSE |
PRODUCT_CD | VARCHAR(10) | TRUE |
CATEGORY | VARCHAR(10) | TRUE |
PRICE | NUMBER | TRUE |
FOOD_ORDER ํ ์ด๋ธ์ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ ORDER_ID, PRODUCT_ID, AMOUNT, PRODUCE_DATE, IN_ DATE, OUT_DATE, FACTORY_ID, WAREHOUSE_ID๋ ๊ฐ๊ฐ ์ฃผ๋ฌธ ID, ์ ํ ID, ์ฃผ๋ฌธ๋, ์์ฐ์ผ์, ์ ๊ณ ์ผ์, ์ถ๊ณ ์ผ์, ๊ณต์ฅ ID, ์ฐฝ๊ณ ID๋ฅผ ์๋ฏธํฉ๋๋ค.
Column name | Type | Nullable |
ORDER_ID | VARCHAR(10) | FALSE |
PRODUCT_ID | VARCHAR(5) | FALSE |
AMOUNT | NUMBER | FALSE |
PRODUCE_DATE | DATE | TRUE |
IN_DATE | DATE | TRUE |
OUT_DATE | DATE | TRUE |
FACTORY_ID | VARCHAR(10) | FALSE |
WAREHOUSE_ID | VARCHAR(10) | FALSE |
๋ฌธ์
FOOD_PRODUCT์ FOOD_ORDER ํ ์ด๋ธ์์ ์์ฐ์ผ์๊ฐ 2022๋ 5์์ธ ์ํ๋ค์ ์ํ ID, ์ํ ์ด๋ฆ, ์ด๋งค์ถ์ ์กฐํํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ์ด๋ ๊ฒฐ๊ณผ๋ ์ด๋งค์ถ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ ์ด๋งค์ถ์ด ๊ฐ๋ค๋ฉด ์ํ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
FOOD_PRODUCT์ FOOD_ORDER ํ ์ด๋ธ์์
> PRODUCT_ID(๊ณตํต์ปฌ๋ผ)์ผ๋ก ํ ์ด๋ธ ์กฐ์ธ์ด ํ์ํจ.
์์ฐ์ผ์๊ฐ 2022๋ 5์์ธ ์ํ๋ค์ ์ํ ID, ์ํ ์ด๋ฆ, ์ด๋งค์ถ์ ์กฐํ > WHERE์ ์กฐ๊ฑด1
์ด๋ ๊ฒฐ๊ณผ๋ ์ด๋งค์ถ์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ > (์ ๋ ฌ์กฐ๊ฑด1) ์ํID๋ณ ์ด๋งค์ถ์ ๊ตฌํด์ผํจ*
์ด๋งค์ถ์ด ๊ฐ๋ค๋ฉด ์ํ ID๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ > (์ ๋ ฌ์กฐ๊ฑด2)
* ํ์ด์์ ์ฃผ์ํด์ผ ํ ์
์ฒ์ ์ฟผ๋ฆฌ์์ SUM(FP.PRICE * FO.AMOUNT)๋ก ์ง์ ์ค๋ต์ด ๋์๋ค.
์กฐ์ธ๋ ํ ์ด๋ธ์์ PRODUCT_ID๋ณ๋ก ๋งค์ถ์ ๊ตฌํ๋ ค๋ฉด ๊ฐ๊ฒฉ x ํ๋งค์๋(PRODUCT_ID๋ณ AMOUNT์ ํฉ) ์ด์ด์ผ ํ๋ค.
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRICE * SUM (FO.AMOUNT) AS TOTAL_SALES
FROM FOOD_PRODUCT FP
RIGHT JOIN FOOD_ORDER FO
ON FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE DATE_FORMAT(FO.PRODUCE_DATE, '%Y-%m') = '2022-05'
GROUP BY 1
ORDER BY 3 DESC, 1
๋ฐ์ดํฐ ํ์ง์๋ถ๋ค๊ป SELECT์ ์ ๊ฐ๊ณต์ปฌ๋ผ๊ณผ JOIN์ ๋ํด ์ง๋ฌธํ๋ค๊ฐ ์ค๋ฌด์์๋ ๋๋๋ก LEFT JOIN์ผ๋ก ์ด๋ค๊ณ ํ๋ค๊ณ ํ์ ์ JOIN ๊ณผ WHERE์ ๊ฐ๊ณต ๊ณผ์ ์ ์ค์ฌ๋ณด๊ณ ์ ์๋์ฒ๋ผ ์ฟผ๋ฆฌ๋ฅผ์์ ํ๋ค.
WHERE์ ์ DATEF_FORMAT() ๋ ์ง๋ณํํจ์์์ BETWEEN ์ผ๋ก DATE ๊ฐ ํํฐ๋งํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๊ฟ๋ณด์๋ค.
SELECT FP.PRODUCT_ID, FP.PRODUCT_NAME, FP.PRICE * SUM (FO.AMOUNT) AS TOTAL_SALES
FROM FOOD_ORDER FO
LEFT JOIN FOOD_PRODUCT FP
ON FP.PRODUCT_ID = FO.PRODUCT_ID
WHERE FO.PRODUCE_DATE BETWEEN '2022-05-01 00:00:00' AND '2022-05-31 23:59:59'
GROUP BY 1
ORDER BY 3 DESC, 1