๋ฌธ์
- ํ๋ก๊ทธ๋๋จธ์ค SQL ๋ฌธ์
ํน์ ๊ธฐ๊ฐ๋์ ๋์ฌ ๊ฐ๋ฅํ ์๋์ฐจ๋ค์ ๋์ฌ๋น์ฉ ๊ตฌํ๊ธฐ
/๋ ๋ฒจ 4
- ๋ฌธ์ ๋ด์ฉ : ํ๋จ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ [๋งํฌ]
๋ด๊ฐ ์์ฑํ Query
WITH TEMP_01 AS( SELECT B.CAR_ID, B.CAR_TYPE, B.DAILY_FEE, MAX(CASE WHEN A.END_DATE <= '2022-11-01' OR A.START_DATE >= '2022-11-30' THEN '๋์ฌ๊ฐ๋ฅ' ELSE '๋์ฌ๋ถ๊ฐ๋ฅ' END) AS ๋์ฌ์ฌ๋ถ FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID WHERE B.CAR_TYPE IN ('์ธ๋จ', 'SUV') GROUP BY CAR_ID HAVING ๋์ฌ์ฌ๋ถ = '๋์ฌ๊ฐ๋ฅ' ), TEMP_02 AS( SELECT C.CAR_ID, C.CAR_TYPE , ROUND(C.DAILY_FEE * (1-D.DISCOUNT_RATE/100)*30, 0) AS FEE FROM TEMP_01 C JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D ON C.CAR_TYPE = D.CAR_TYPE WHERE D.DURATION_TYPE = '30์ผ ์ด์' ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC) SELECT * FROM TEMP_02 WHERE FEE BETWEEN 500000 AND 2000000
๋จผ์ , ์ฐจ๋ ์ ๋ณด(CAR_RENTAL_COMPANY_CAR
) ํ
์ด๋ธ๊ณผ ์ฐจ๋ ๋์ฌ ์ ๋ณด(CAR_RENTAL_COMPANY_RENTAL_HISTORY
) ํ
์ด๋ธ์ JOIN
ํด ์ค๋ค.
WHERE
์ ์์ CAR_TYPE
์ด '์ธ๋จ', 'SUV'์ธ ์ฐจ๋ ๋ฐ์ดํฐ๋ฅผ ํํฐ๋งํด์ค๋ค.
์ฐจ๋ ID ๋ณ๋ก 2022-11-01 ~ 2022-11-30 ์ ๋์ฌ๊ฐ ๊ฐ๋ฅํ ์ฐจ๋ ๋ฐ์ดํฐ๋ฅผ ์ ํํ๊ธฐ ์ํด์ ์ฐ์ CAR_ID
๊ธฐ์ค์ผ๋ก GROUP BY
ํด ์ค๋ค.
SELECT
์ ์์, ๋์ฌ ์ฌ๋ถ
๋ผ๋ ์ปฌ๋ผ์ ๋ง๋ค๊ณ ์ฐจ๋ ๊ธฐ๋ก์ค์ END_DATE
๊ฐ '2022-11-01' ์ด์ ์ธ ๊ธฐ๋ก์ด๋ START_DATE
๊ฐ '2022-11-30' ์ดํ์ธ ๋ฐ์ดํฐ๋ค์ '๋์ฌ ๊ฐ๋ฅ', ๊ทธ ์ธ์ ๋ฐ์ดํฐ๋ '๋์ฌ๋ถ๊ฐ๋ฅ' ์ด๋ผ๊ณ ์ถ๋ ฅํด์ค๋ค.
MAX()
ํจ์๋ฅผ ํตํด, ์ฐจ๋๋ณ๋ก ๋์ฌ๊ฐ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ๊ฐ ํ ๊ฑด์ด๋ผ๋ ์๋ ์ฐจ๋์ '๋์ฌ๋ถ๊ฐ๋ฅ'์ด ์ถ๋ ฅ๋๋๋ก ํด ์ค๋ค.
์ ๋ฆฌ) ํ ๋์ ์ฐจ๋์ด๋ผ๋ ์ฌ๋ฌ ๊ฐ์ ๋์ฌ ๊ธฐ๋ก (ํน์ ๋์ฌ ์์ ๊ธฐ๋ก) ์ด ์๋ค. ์ด ๊ธฐ๋ก๋ค์ '2022-11-01 ~ 2022-11-30' ๊ตฌ๊ฐ ๊ธฐ์ค์ผ๋ก, ๋์ฌ๊ฐ๋ฅ / ๋์ฌ๋ถ๊ฐ๋ฅ ์ผ๋ก ๊ตฌ๋ถํ๊ณ , CAR_ID ๋ณ๋ก GROUP BY ํ MAX() ํจ์๋ฅผ ์ ์ฉํด์ฃผ๋ฉด, ํ ๊ฑด์ด๋ผ๋ ๋์ฌ ๋ถ๊ฐ๋ฅํ ์ฐจ๋์ ๋์ฌ ์ฌ๋ถ
์ปฌ๋ผ์ '๋์ฌ๋ถ๊ฐ๋ฅ' ์ด๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๊ฒ ๋๋ค. (์ฆ, 11์์ ๋์ฌ๊ฐ ๋ถ๊ฐ๋ฅํ ์ฐจ๋์ '๋์ฌ๋ถ๊ฐ๋ฅ', ๋์ฌ๊ฐ ๊ฐ๋ฅํ ์ฐจ๋์ '๋์ฌ๊ฐ๋ฅ' ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅํ๋ค.)
HAVING
์ ์ ๋์ฌ ์ฌ๋ถ๊ฐ '๋์ฌ๊ฐ๋ฅ' ์ธ ์ฐจ๋ ์ ๋ณด๋ง ํํฐ๋งํ๋ค.
์์๊น์ง์ ํ
์ด๋ธ์ TEMP_01
๋ก ์ง์
์ดํ TEMP_01
๊ณผ ํ ์ธ ํ
์ด๋ธ(CAR_RENTAL_COMPANY_DISCOUNT_PLAN
)์ CAR_TYPE
๊ธฐ์ค์ผ๋ก JOIN
ํ๋ค.
์ฌ๋ฌ ํ ์ธ๋ค ์ค, '30์ผ ์ด์' ํ ์ธ ์ ๋ณด๋ง ์ถ์ถํ๊ธฐ ์ํด WHERE
์ ์ DURATION_TYPE = '30์ผ ์ด์'
์กฐ๊ฑด์ ์ค๋ค.
์ ์ฒด์ ์ธ ์๊ธ์ ๊ณ์ฐํด์ค๋ค. DAILY_FEE
์ DISCOUNT_RATE
๋ฅผ ์ ์ฉํ ๊ธ์ก์ ๊ณฑํด์ฃผ๊ณ , ROUND
ํจ์๋ฅผ ์ด์ฉํด ์ ์๋ถ๋ถ๋ง ์ถ๋ ฅํด์ค๋ค. ๊ธ์ก์ FEE
์ปฌ๋ผ์ผ๋ก ์ถ๋ ฅํด์ค๋ค.
ORDER BY
๋ฅผ ํตํด FEE
๋ด๋ฆผ์ฐจ์, CAR_TYPE
, CAR_ID
์์ผ๋ก ์ ๋ ฌํด์ค๋ค.
์์๊น์ง์ ํ
์ด๋ธ์ TEMP_02
๋ก ์ง์
TEMP_02
ํ
์ด๋ธ์์ FEE
๊ฐ 50000 ~ 2000000 ์ฌ์ด์ ๊ฐ์ ๊ฐ์ง๋ ๋ฐ์ดํฐ๋ง ์ถ๋ ฅํ๊ธฐ ์ํด WHERE
์ ์์ ํด๋น ์กฐ๊ฑด์ ๊ฑธ์ด์ค๋ค.
GROUP BY
๋ฅผ ํตํด '์ฐจ๋๋ณ' ๋ฐ์ดํฐ๋ฅผ ๊ตฌํด์ค์ผ ํ๋๋ฐ, 11์ ๊ธฐ๊ฐ์ ๋์ฌ๊ฐ ๋ถ๊ฐ๋ฅํ ์ฐจ๋์ ์ฐพ๊ธฐ ์ํด CASE WHEN
์ ํตํด ๋์ฌ ์ฌ๋ถ๋ฅผ ๊ตฌํด์ฃผ์๊ณ , GROUP BY
ํ์ ๋ ๋์ฌ์ฌ๋ถ๊ฐ '๋์ฌ๋ถ๊ฐ๋ฅ'์ธ ์ฐจ๋์ '๋์ฌ๋ถ๊ฐ๋ฅ' ๊ฐ์ด ๋ํ๊ฐ์ด ๋๋๋ก MAX()
ํจ์๋ฅผ ์ฌ์ฉํด์ฃผ์๋ค.