https://school.programmers.co.kr/learn/courses/30/lessons/151141
๋ฌธ์
CAR_RENTAL_COMPANY_CAR ํ ์ด๋ธ๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ ์ด๋ธ๊ณผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ์์
์๋์ฐจ ์ข ๋ฅ๊ฐ 'ํธ๋ญ'์ธ ์๋์ฐจ์ ๋์ฌ ๊ธฐ๋ก์ ๋ํด์
๋์ฌ ๊ธฐ๋ก ๋ณ๋ก ๋์ฌ ๊ธ์ก(์ปฌ๋ผ๋ช : FEE)์ ๊ตฌํ์ฌ
๋์ฌ ๊ธฐ๋ก ID์ ๋์ฌ ๊ธ์ก ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๋ SQL๋ฌธ์ ์์ฑํด์ฃผ์ธ์.
๊ฒฐ๊ณผ๋ ๋์ฌ ๊ธ์ก์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ณ , ๋์ฌ ๊ธ์ก์ด ๊ฐ์ ๊ฒฝ์ฐ ๋์ฌ ๊ธฐ๋ก ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํด์ฃผ์ธ์.
ํ์ด
1. car ์ history ํ ์ด๋ธ์ inner join
2. plan ํ ์ด๋ธ๊ณผ left join
-> history ํ ์ด๋ธ์์ start date ์ end date ์ฌ์ด์ ๋ ์ง๋ฅผ datediff ๋ก ์ฐ์ฐํ์ฌ ๋์ฌ๊ธฐ๊ฐ์ ๊ตฌํ๊ณ case when์ ์ด์ฉํ์ฌ์ด ๋์ฌ๊ธฐ๊ฐ์ ๋ฐ๋ผ duration_type ๊ณผ ๋งค์นญํ์ฌ join ํ๋ฉด ๊ฐ ๋์ฌ๊ธฐ๊ฐ์ ๋ง๋ ํ ์ธ์จ์ด ์นผ๋ผ์ผ๋ก ๋ค์ด๊ฐ๋ค
์ด๋ ๋ ์ง๋ฅผ +1 ํ๋๊ฑฐ์ ์ฃผ์ํ์,
์์ ๋ฅผ ๋ณด๋ฉด start date: 08-03, end date: 08-04์ ๋์ฌ๊ธฐ๊ฐ์ 2์ผ๋ก ๊ณ์ฐํ๋ค
์์์น
3. ์๊ธ์ ๊ณ์ฐํ์ฌ fee ์นผ๋ผ์ ๋ฃ๋๋ค
fee = ๊ธฐ๊ฐ * daily_fee * ํ ์ธ์จ
ํ ์ธ์จ = (100 - discount_rate) / 100
-> ๋ง์ฝ ๋์ฌ๊ธฐ๊ฐ์ด 7์ผ ๋ฏธ๋ง์ด๋ผ๋ฉด ๋งค์นญ๋ ํ ์ธ ํ๋์ด ์๊ฒ๋๊ณ p.discount_rate ๋ null ๊ฐ์ ๊ฐ์ง๊ฒ ๋๋ค. ์ด ๊ฒฝ์ฐ discount_rate๋ 0์ผ๋ก ๊ณ์ฐํ๋ค
๊ทธ๋ฆฌ๊ณ ์ต์ข ์ผ๋ก ๋์จ fee๋ ์์์ ์ด ํฌํจ๋์ด์๊ธฐ์ floor ๋ก ๋ด๋ฆผ ์ฐ์ฐ์ ํด์ค๋ค
4. where ์ ์ด์ฉํ์ฌ ์กฐ๊ฑด ๊ฑธ๊ณ order by ์ด์ฉํ์ฌ ์์ ์กฐ๊ฑด ๋ง์ถฐ์ฃผ๋ฉด ๋
select h.history_id,
floor((datediff(h.end_date, h.start_date)+1) * c.daily_fee * (100-ifnull(p.discount_rate, 0))/100) as fee
from car_rental_company_car c
join car_rental_company_rental_history h on c.car_id = h.car_id
left join car_rental_company_discount_plan p on c.car_type = p.car_type and p.duration_type =
case when datediff(h.end_date, h.start_date)+1 between 7 and 29 then "7์ผ ์ด์"
when datediff(h.end_date, h.start_date)+1 between 30 and 89 then "30์ผ ์ด์"
when datediff(h.end_date, h.start_date)+1 >= 90 then "90์ผ ์ด์" end
where c.car_type = 'ํธ๋ญ'
order by fee desc, h.history_id desc