[ํ๋ก๊ทธ๋๋จธ์ค level 4] ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก๋ณ ๋์ฌ ๊ธ์ก ๊ตฌํ๊ธฐ
๋ฌธ์ ์ค๋ช
๋ค์์ ์ด๋ ์๋์ฐจ ๋์ฌ ํ์ฌ์์ ๋์ฌ ์ค์ธ ์๋์ฐจ๋ค์ ์ ๋ณด๋ฅผ ๋ด์ CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ๊ณผ ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ์ ๋ณด๋ฅผ ๋ด์ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ๊ณผ ์๋์ฐจ ์ข ๋ฅ ๋ณ ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ ๋ณ ํ ์ธ ์ ์ฑ ์ ๋ณด๋ฅผ ๋ด์ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ ์ ๋๋ค.
CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS ๋ ๊ฐ๊ฐ ์๋์ฐจ ID, ์๋์ฐจ ์ข ๋ฅ, ์ผ์ผ ๋์ฌ ์๊ธ(์), ์๋์ฐจ ์ต์ ๋ฆฌ์คํธ๋ฅผ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
CAR_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DAILY_FEE | INTEGER | FALSE |
OPTIONS | VARCHAR(255) | FALSE |
์๋์ฐจ ์ข ๋ฅ๋ '์ธ๋จ', 'SUV', '์นํฉ์ฐจ', 'ํธ๋ญ', '๋ฆฌ๋ฌด์ง' ์ด ์์ต๋๋ค. ์๋์ฐจ ์ต์ ๋ฆฌ์คํธ๋ ์ฝค๋ง(',')๋ก ๊ตฌ๋ถ๋ ํค์๋ ๋ฆฌ์คํธ(์: ''์ด์ ์ํธ,์ค๋งํธํค,์ฃผ์ฐจ๊ฐ์ง์ผ์'')๋ก ๋์ด์์ผ๋ฉฐ, ํค์๋ ์ข ๋ฅ๋ '์ฃผ์ฐจ๊ฐ์ง์ผ์', '์ค๋งํธํค', '๋ค๋น๊ฒ์ด์ ', 'ํตํ์ํธ', '์ด์ ์ํธ', 'ํ๋ฐฉ์นด๋ฉ๋ผ', '๊ฐ์ฃฝ์ํธ' ๊ฐ ์์ต๋๋ค.
CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ, HISTORY_ID, CAR_ID, START_DATE, END_DATE ๋ ๊ฐ๊ฐ ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ID, ์๋์ฐจ ID, ๋์ฌ ์์์ผ, ๋์ฌ ์ข ๋ฃ์ผ์ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
HISTORY_ID | INTEGER | FALSE |
CAR_ID | INTEGER | FALSE |
START_DATE | DATE | FALSE |
END_DATE | DATE | FALSE |
CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ์ ์๋์ ๊ฐ์ ๊ตฌ์กฐ๋ก ๋์ด์์ผ๋ฉฐ, PLAN_ID, CAR_TYPE, DURATION_TYPE, DISCOUNT_RATE ๋ ๊ฐ๊ฐ ์๊ธ ํ ์ธ ์ ์ฑ ID, ์๋์ฐจ ์ข ๋ฅ, ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ, ํ ์ธ์จ(%)์ ๋ํ๋ ๋๋ค.
Column nameTypeNullable
PLAN_ID | INTEGER | FALSE |
CAR_TYPE | VARCHAR(255) | FALSE |
DURATION_TYPE | VARCHAR(255) | FALSE |
DISCOUNT_RATE | INTEGER | FALSE |
ํ ์ธ์จ์ด ์ ์ฉ๋๋ ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ๋ก๋ '7์ผ ์ด์' (๋์ฌ ๊ธฐ๊ฐ์ด 7์ผ ์ด์ 30์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ), '30์ผ ์ด์' (๋์ฌ ๊ธฐ๊ฐ์ด 30์ผ ์ด์ 90์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ), '90์ผ ์ด์' (๋์ฌ ๊ธฐ๊ฐ์ด 90์ผ ์ด์์ธ ๊ฒฝ์ฐ) ์ด ์์ต๋๋ค. ๋์ฌ ๊ธฐ๊ฐ์ด 7์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ ํ ์ธ์ ์ฑ ์ด ์์ต๋๋ค.
๋ฌธ์
CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ๊ณผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ์์ ์๋์ฐจ ์ข ๋ฅ๊ฐ 'ํธ๋ญ'์ธ ์๋์ฐจ์ ๋์ฌ ๊ธฐ๋ก์ ๋ํด์ ๋์ฌ ๊ธฐ๋ก ๋ณ๋ก ๋์ฌ ๊ธ์ก(์ปฌ๋ผ๋ช : FEE)์ ๊ตฌํ์ฌ ๋์ฌ ๊ธฐ๋ก ID์ ๋์ฌ ๊ธ์ก ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์. ๊ฒฐ๊ณผ๋ ๋์ฌ ๊ธ์ก์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ณ , ๋์ฌ ๊ธ์ก์ด ๊ฐ์ ๊ฒฝ์ฐ ๋์ฌ ๊ธฐ๋ก ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
๋ฌธ์ ํ์ด
SELECT H.HISTORY_ID,
ROUND(C.DAILY_FEE*(DATEDIFF(END_DATE, START_DATE)+1)*
(CASE
WHEN DATEDIFF(END_DATE, START_DATE)+1<7 THEN 1
WHEN DATEDIFF(END_DATE, START_DATE)+1<30 THEN 0.95
WHEN DATEDIFF(END_DATE, START_DATE)+1<90 THEN 0.92
ELSE 0.85
END),0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS C
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H ON C.CAR_ID=H.CAR_ID
WHERE C.CAR_TYPE='ํธ๋ญ'
ORDER BY FEE DESC, H.HISTORY_ID DESC;
- CAR_RENTAL_COMPANY_CAR๊ณผ CAR_RENTAL_HISTORY ํ ์ด๋ธ์ ๊ฐ ํ ์ด๋ธ์ CAR_ID๋ฅผ ๊ธฐ์ค์ผ๋ก JOINํ๋ค.
- C ํ ์ด๋ธ์ CAR_TYPE์ด 'ํธ๋ญ'์ธ ๋ฐ์ดํฐ๋ฅผ ์ถ์ถํ๋ค.
- ์ด๋ ๊ฒ ์ถ์ถํ ๋ฐ์ดํฐ์์ ๋์ฌ ๊ธ์ก์ FEE ์ปฌ๋ผ์ผ๋ก ๊ตฌํ๋ ๊ฒ์ด ๊น๋ค๋ก์ ๋ค.
- ์ฐ์ ์ ์ ํํ๋ก ํํํด์ผ ํ๊ธฐ ๋๋ฌธ์ ROUND(๊ณ์ฐํ ๋์ฌ๊ธ์ก, 0) ํํ๋ก ์ ์๊น์ง๋ง ๋ฐ์ฌ๋ฆผํด์ ์์์ ์ ์ ๊ฑฐํด์ค๋ค.
- ๋์ฌ ๊ธ์ก์ ํ๋ฃจ ์ด์ฉ ๊ธ์ก(DAILY_FEE)์ ๋์ฌ ์ผ ์(DATEDIFF(END_DATE, START_DATE)+1)์ ๋์ฌ ์ผ ์์ ๋ฐ๋ฅธ ํ ์ธ์จ(CASE...WHEN...THEN...END)์ ๊ณฑํด์ ๊ตฌํ๋ค.
- ์บก์ฒํ์ง ๋ชปํ์ง๋ง ํ ์ธ ์ ์ฑ
์ด ์ ์ฅ๋ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ
์ด๋ธ์์ CAR_TYPE์ด 'ํธ๋ญ'์ธ ๋ฐ์ดํฐ์ ํ ์ธ์จ์ ๋ค์๊ณผ ๊ฐ๋ค.
- 7์ผ ์ด์์ธ ๊ฒฝ์ฐ 5% ํ ์ธ
- 30์ผ ์ด์์ธ ๊ฒฝ์ฐ 8% ํ ์ธ
- 90์ผ ์ด์์ธ ๊ฒฝ์ฐ 15% ํ ์ธ
- ๋๋ฌธ์, ๋์ฌ์ผ์๊ฐ 7์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ๋ ํ ์ธ์ ๋ฐ์ง ๋ชปํ๋ฏ๋ก 1, 30์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ๋ 0.95, 90์ผ ๋ฏธ๋ง์ธ ๊ฒฝ์ฐ๋ 0.92, ๊ทธ ์ด์์ธ ๊ฒฝ์ฐ๋ 0.85์ ํ ์ธ์จ์ด ์ ์ฉ๋๋ค.
- ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ CASE...WHEN...THEN...END ๊ตฌ๋ฌธ์ CASE์์ END์ ๋๋ฌํ ๋๊น์ง WHEN...THEN ๊ตฌ๋ฌธ์ด ์์ฐจ์ ์ผ๋ก ์คํ๋๊ธฐ ๋๋ฌธ์ ๋ฉฐ์น ๋ฏธ๋ง์ธ์ง๋ ๋ ์์ ์๋ถํฐ ๊ตฌ๋ถํด์ค์ผ ํ๋ค.
- ์ผ์๊ฐ 2์ผ ๊ฒฝ์ฐ 30์ผ ๋ฏธ๋ง์ด 7์ผ ๋ฏธ๋ง๋ณด๋ค ๋ ๋จผ์ ๋์๋ฒ๋ฆฌ๋ฉด 30์ผ ๋ฏธ๋ง์ผ๋ก ์ฒ๋ฆฌ๋จ
- ์ด๋ ๊ฒ ๊ตฌํ ๋์ฌ ๊ธ์ก๊ณผ ๊ฐ ๋์ฌ ๊ธฐ๋ก ID๋ฅผ ์ถ์ถํ๋ค.
- ๋ง์ง๋ง์ผ๋ก, ๋์ฌ ๊ธ์ก(FEE)์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ ๋ค์ ๋์ฌ ๊ธ์ก์ด ๊ฐ์ ๊ฒฝ์ฐ ๋์ฌ ๊ธฐ๋ก ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ ์ถ๋ ฅํ๋ค.