๐ข ๋ณธ ํฌ์คํ ์ ํ์ฉ๋๋ ๊ธฐ๋ณธ ๋ฌธ์ ๋ฐ ์๋ฃ ์ถ์ฒ๋
ํ๋ก๊ทธ๋๋จธ์ค ์ฝ๋ฉํ
์คํธ ์ฐ์ต,
https://school.programmers.co.kr/learn/challenges?page=1&languages=mysql%2Coracle์์ ๋ฐํ๋๋ค.
โ ๋ฌธ์
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋ฅ ์ผํ๋ชฐ์์ ํ๋งค์ค์ธ ์ํ๋ค์ ์ํ ์ ๋ณด๋ฅผ ๋ด์ PRODUCT ํ ์ด๋ธ๊ณผ ์คํ๋ผ์ธ ์ํ ํ๋งค ์ ๋ณด๋ฅผ ๋ด์ OFFLINE_SALE ํ ์ด๋ธ ์ ๋๋ค. PRODUCT ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก PRODUCT_ID, PRODUCT_CODE, PRICE๋ ๊ฐ๊ฐ ์ํ ID, ์ํ์ฝ๋, ํ๋งค๊ฐ๋ฅผ ๋ํ๋ ๋๋ค.
Column name | Type | Nullable |
PRODUCT_ID | INTEGER | FALSE |
PRODUCT_CODE | VARCHAR(8) | FALSE |
PRICE | INTEGER | FALSE |
์ํ ๋ณ๋ก ์ค๋ณต๋์ง ์๋ 8์๋ฆฌ ์ํ์ฝ๋ ๊ฐ์ ๊ฐ์ง๋ฉฐ, ์ 2์๋ฆฌ๋ ์นดํ ๊ณ ๋ฆฌ ์ฝ๋๋ฅผ ์๋ฏธํฉ๋๋ค.
OFFLINE_SALE ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ OFFLINE_SALE_ID, PRODUCT_ID, SALES_AMOUNT, SALES_DATE๋ ๊ฐ๊ฐ ์คํ๋ผ์ธ ์ํ ํ๋งค ID, ์ํ ID, ํ๋งค๋, ํ๋งค์ผ์ ๋ํ๋ ๋๋ค.
Column name | Type | Nullable |
OFFLINE_SALE_ID | INTEGER | FALSE |
PRODUCT_ID | INTEGER | FALSE |
SALES_AMOUNT | INTEGER | FALSE |
SALES_DATE | DATE | FALSE |
๋์ผํ ๋ ์ง, ์ํ ID ์กฐํฉ์ ๋ํด์๋ ํ๋์ ํ๋งค ๋ฐ์ดํฐ๋ง ์กด์ฌํฉ๋๋ค.
๋ฌธ์
PRODUCT ํ ์ด๋ธ๊ณผ OFFLINE_SALE ํ ์ด๋ธ์์ ์ํ์ฝ๋ ๋ณ ๋งค์ถ์ก(ํ๋งค๊ฐ * ํ๋งค๋) ํฉ๊ณ๋ฅผ ์ถ๋ ฅํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ๋งค์ถ์ก์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์๊ณ ๋งค์ถ์ก์ด ๊ฐ๋ค๋ฉด ์ํ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
โ ํ์ด
๋ฌธ์ ์๊ตฌ์ฌํญ
PRODUCT ํ ์ด๋ธ๊ณผ OFFLINE_SALE ํ ์ด๋ธ์์ ์ํ์ฝ๋ ๋ณ ๋งค์ถ์ก(ํ๋งค๊ฐ * ํ๋งค๋) ํฉ๊ณ๋ฅผ ์ถ๋ ฅ
> ํ ์ด๋ธ ์กฐ์ธ, GROUP BY, ์ปฌ๋ผ๊ณผ ์ปฌ๋ผ ์ง๊ณ ํจ์
๊ฒฐ๊ณผ๋ ๋งค์ถ์ก์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ > ์ ๋ ฌ์กฐ๊ฑด1
๋งค์ถ์ก์ด ๊ฐ๋ค๋ฉด ์ํ์ฝ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ค๋ฆ์ฐจ์ ์ ๋ ฌ > ์ ๋ ฌ์กฐ๊ฑด2
โ 1์ฐจ ํ์ด
1 ๋จ๊ณ) ํ ์ด๋ธ ๊ฐ inner join , ๊ณตํต ์ปฌ๋ผ์ PRODUCT_ID
1-1๋จ๊ณ) ํ์ํ ์ปฌ๋ผ์ ์ถ๋ ค์ WITH์ ๋ก ์์ํ ์ด๋ธ 'T1' ์์ฑ.
< ์์ํ ์ด๋ธ T1 ์ปฌ๋ผ ์ค๋ช >
์ปฌ๋ผ | ๊ฐ |
PRDOUCT_CODE | ์ํ์ฝ๋ |
SUM(SALES_AMOUNT) AS SALES_AMOUNT |
์ํ ์ฝ๋๋ณ๋ก ๊ทธ๋ฃนํํด์ ๋ฌธ์ ์์ ์๊ตฌํ SALES_AMOUNT ๋ผ๋ ๋งค์ถ์ก ์ปฌ๋ผ ์์ฑ |
PD. PRICE AS PRICE |
์ํ ๊ฐ๊ฒฉ |
2๋จ๊ณ) ์์ ํ ์ด๋ธ T1์์ SALES_AMOUNT x PRICE๋ก ์ํ์ฝ๋๋ณ ๋งค์ถ์ก ๊ณ์ฐํด์
ORDER BY ์ ์์ ์ ๋ ฌ์กฐ๊ฑด1, 2 ์ ์ฉํด์ ์ถ๋ ฅ
WITH T1 AS
(SELECT PD.PRODUCT_CODE AS PRODUCT_CODE,
SUM(SALES_AMOUNT) AS SALES_AMOUNT,
PD. PRICE AS PRICE
FROM PRODUCT PD
INNER JOIN OFFLINE_SALE OS
ON PD.PRODUCT_ID = OS.PRODUCT_ID
GROUP BY PD.PRODUCT_CODE)
SELECT T1.PRODUCT_CODE AS PRODUCT_CODE,
T1.SALES_AMOUNT * T1.PRICE AS SALES
FROM T1
ORDER BY 2 DESC, 1;
1์ฐจ ํ์ด ํ๊ณ )
์ฝ๋ ๋์๊ฐ๋ ์๊ฐ์ ์ค์ฌ๋ณด๋ ค๊ณ ์์ ํ ์ด๋ธ์ ์์ฑํ๋๋ฐ ์์ฑํ๊ณ ์ํ๋ ์ํ์ฝ๋๋ณ ๋งค์ถ์ก ์ถ์ถํ๋ค๋ณด๋ SELECT ์ ์์ ๊ณ์ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ฃ์ด์ ์ฟผ๋ฆฌ ์ถ๋ ฅ์ ์ฌ์ ํ ์๊ฐ์ด ๋ ์์๋ ๊ฒ ๊ฐ๋ค.. ๐จ ์ถ๋ ฅ์ ์ข๋ ๊น๋ํ ์ฝ๋๊ฐ ์์ ๊ฒ ๊ฐ์๋ฐ 2์ฐจ ํ์ด๋ก ๋ค์ ํ์ด๋ด์ผ๊ฒ ๋ค.