๐ 1. ๋ฌธ์ ์ค๋ช
โ๏ธ 2. ๋ฌธ์ ์์ฝ
๋ฌธ์ ์์ ์ฃผ์ด์ง ์กฐ๊ฑด
CAR_RENTAL_COMPANY_CAR | CAR_RENTAL_COMPANY_RENTAL_HISTORY | CAR_RENTAL_COMPANY _DISCOUNT_PLAN |
๋์ฌ ์ค์ธ ์๋์ฐจ๋ค์ ์ ๋ณด | ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ์ ๋ณด | ์๋์ฐจ ์ข
๋ฅ ๋ณ ๋์ฌ ๊ธฐ๊ฐ ์ข
๋ฅ ๋ณ ํ ์ธ ์ ์ฑ ์ ๋ณด |
CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS |
HISTORY_ID, CAR_ID, START_DATE, END_DATE |
PLAN_ID, CAR_TYPE, DURATION_TYPE, DISCOUNT_RATE |
- ์๋์ฐจ ID, - ์๋์ฐจ ์ข ๋ฅ, - ์ผ์ผ ๋์ฌ ์๊ธ(์), - ์๋์ฐจ ์ต์ ๋ฆฌ์คํธ, |
- ์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ID, - ์๋์ฐจ ID - ๋์ฌ ์์์ผ, - ๋์ฌ ์ข ๋ฃ์ผ |
- ์๊ธ ํ ์ธ ์ ์ฑ
ID, - ์๋์ฐจ ์ข ๋ฅ, - ๋์ฌ ๊ธฐ๊ฐ ์ข ๋ฅ, - ํ ์ธ์จ(%) |
๋ฌธ์ ์์ฝ
1) ์๋์ฐจ ์ข ๋ฅ๊ฐ 'ํธ๋ญ'์ธ ์๋์ฐจ
2) ๋์ฌ ๊ธฐ๋ก์ ๋ํด์, ๋์ฌ ๊ธฐ๋ก ๋ณ๋ก ๋์ฌ ๊ธฐ๋ก ID์ ๋์ฌ ๊ธ์ก ๋ฆฌ์คํธ๋ฅผ ์ถ๋ ฅํ๊ธฐ
3) ๊ฒฐ๊ณผ๋ ๋์ฌ ๊ธ์ก์ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๊ณ , ๋์ฌ ๊ธ์ก์ด ๊ฐ์ ๊ฒฝ์ฐ ๋์ฌ ๊ธฐ๋ก ID๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
2-1. ๋์ฌ ๊ธฐ๋ก๋ณ ๋์ฌ ๊ธ์ก์ ๊ณ์ฐํ๊ธฐ ์ํด ํ์ํ ์ปฌ๋ผ
- ๋์ฌ ๊ธฐ๊ฐ (period): ๋์ฌํ ์ผ์
- ์ผ์ผ ์๊ธ (daily_fee): ํ๋ฃจ์ ์ฒญ๊ตฌ๋๋ ๊ธฐ๋ณธ ๊ธ์ก
- ํ ์ธ์จ (discount_rate): ์ ์ฉ ๊ฐ๋ฅํ ํ ์ธ์จ (ํผ์ผํธ ๊ฐ)
์๋์ฐจ ์ข ๋ฅ๋ณ, ๊ธฐ๊ฐ๋ณ๋ก ํ ์ธ์จ์ด ๋ค๋ฅธ๋ฐ ์ข ๋ฅ๋ ์ด๋ฏธ 'ํธ๋ญ'์ผ๋ก ํ์ ๋์ด ์๊ธฐ ๋๋ฌธ์ ์๋ธ์ฟผ๋ฆฌ์์ ๊ธฐ๊ฐ๋ณ๋ก JOIN์ ํด์ผ ํ๋ค.
๋์ฌ๊ธฐ๊ฐ ๊ตฌํ๊ธฐ
car_rental_company_rental_history ํ ์ด๋ธ์์ DATEDIFF() + 1์ ํตํด ๋์ฌ ๊ธฐ๊ฐ์ ๊ตฌํด์ผ ํ๋ค.
+ 1์ ํ๋ ์ด์ ๋ ๋น๋ฆฐ ๋น์ผ์ ๋ฐ๋ฉํด๋ 1์ผ ๋์ฌ๋ก ๊ณ์ฐํ๊ธฐ ๋๋ฌธ์ด๋ค. ๋์ฌ ๊ธฐ๊ฐ์ ๋จผ์ ๊ตฌํ๊ณ ํด๋น ๊ธฐ๊ฐ์ CASE๋ฌธ์ผ๋ก (7์ผ ์ด์, 30์ผ ์ด์, 90์ผ ์ด์)์ผ๋ก ๊ตฌ๋ถํ๋ ์์ ์ ํตํด ๋์ฌ๊ธฐ๊ฐ ์ข ๋ฅ ์ปฌ๋ผ์ธ DURATION_TYPE์ ๊ฒฐ์ ํ ์ ์๋ค.
-> ์ฌ๊ธฐ์ ๊ตฌํ ๊ฐ์ WITH VALUE ๋ผ๋ ์๋ธ์ฟผ๋ฆฌ๋ก ๋ง๋ค๊ณ ์ค์ ๋ฐ์ดํฐ ๊ฒ์์ ์ด ์๋ธ์ฟผ๋ฆฌ ์์์ ์ํํ๊ธฐ
๋ฐ๋ผ์ ์๋ธ์ฟผ๋ฆฌ์ ์ค์ ์ฟผ๋ฆฌ๋ก ๋ ๋ถ๋ถ์ผ๋ก ๊ตฌ๋ถํด์ SQL๋ฌธ์ ์์ฑํด์ผ ํจ.
2-2. ์๋ธ์ฟผ๋ฆฌ(WITH value ๊ตฌ๋ฌธ) ์์ ์ํํ๋ ์์
car_rental_company_rental_history ํ ์ด๋ธ์ `end_date`, `start_date` ์ปฌ๋ผ์ ๊ฐ์ ธ์ DATEDIFF ํจ์ + 1 ํด์ ๋์ฌ ๊ธฐ๊ฐ(period)์ ๊ณ์ฐํ๋ค.
์ด ๊ฐ์ผ๋ก CASE๋ฌธ์ ๋ถ๊ธฐํด์ DURATION_TYPE ๊ฒฐ์ ํ๊ธฐ (๋ณ์นญ history)
์์์ ํํฐ๋งํ history์ car_rental_company_car ํ ์ด๋ธ์ car.car_id = history.car_id๋ก JOIN ํ๋ค.
์๋์ฐจ ์ข ๋ฅ๊ฐ 'ํธ๋ญ'์ธ ์๋์ฐจ๋ง ํํฐ๋งํ๋ค.
WITH VALUE AS (
SELECT CAR.DAILY_FEE, CAR.CAR_TYPE, HISTORY.HISTORY_ID,
DATEDIFF(END_DATE, START_DATE) + 1 AS PERIOD,
CASE
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 90 THEN '90์ผ ์ด์'
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '30์ผ ์ด์'
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 7 THEN '7์ผ ์ด์'
ELSE ''
END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORY
INNER JOIN CAR_RENTAL_COMPANY_CAR AS CAR ON CAR.CAR_ID = HISTORY.CAR_ID
WHERE CAR.CAR_TYPE = 'ํธ๋ญ')
2-3. ์ค์ SELECT ์ ์์ ์ํํ๋ ์์
์์์ ๊ตฌํ WITH VALUE ์ ๊ฒฐ๊ณผ๋ฅผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ ์ด๋ธ๊ณผCAR_TYPE, DURATION_TYPE ์ปฌ๋ผ์ผ๋ก ์กฐ์ธํด์ ์ต์ข ๋์ฌ๊ธ์ก์ ๊ณ์ฐํ๊ณ ์ ๋ ฌํ๊ธฐ
๋์ฌ ๊ธ์ก ๊ณ์ฐํ๋ ๋ฒ
์ผ์ผ ์๊ธ × ๋์ฌ ๊ธฐ๊ฐ × (100% - ํ ์ธ์จ)
value.daily_fee * value.period * (100 - IFNULL(plan.discount_rate,0)) / 100
ํ ์ธ์จ์ ๋ฐฑ๋ถ์จ๋ก ๊ณ์ฐํ๊ธฐ ์ํด (100 - discount_rate) / 100์ ์ฌ์ฉํ๋ค.
์) ํ ์ธ์จ 10%๋ผ๋ฉด, ๊ธ์ก์ 90 / 100์ ๊ณฑํด 90%๋ง ๋จ๊ธฐ๊ธฐ
VALUE.DAILY_FEE * VALUE.PERIOD
DAILY_FEE๋ ํ๋ฃจ ๋์ฌ ๋น์ฉ์ด๊ณ , PERIOD๋ ๋์ฌ ๊ธฐ๊ฐ(์ผ ์)์ด๋ฏ๋ก ์ด ๋ ๊ฐ์ ๊ณฑํ๋ฉด ๊ธฐ๋ณธ ๋์ฌ๊ธ์ก(ํ ์ธ ์ ๊ธ์ก)์ ๊ณ์ฐํ ์ ์๋ค.
IFNULL(PLAN.DISCOUNT_RATE, 0)
IFNULL ํจ์๋ก NULL ์ฒ๋ฆฌ ํด ์ฃผ๋ ์ด์ ๋ ๋ง์ฝ์ PLAN.DISCOUNT_RATE ๊ฐ์ผ๋ก NULL์ด ๋ค์ด์ค๋ ๊ฒฝ์ฐ์ NULL ์ฒ๋ฆฌ๋ฅผ ํ์ง ์์ผ๋ฉด, ์ฐ์ฐ์์ ์ค๋ฅ๋ ๋ฐ์ํ์ง ์์ง๋ง ๊ฒฐ๊ณผ๊ฐ ํญ์ NULL์ด ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์ ๋ ฌ
๋์ฌ ๊ธ์ก(FEE) ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ, ๊ธ์ก์ด ๋์ผํ๋ฉด history_id ๊ธฐ์ค ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌ
ORDER BY 2 DESC, 1 DESC
์ ์ฒด ์ฟผ๋ฆฌ
SELECT VALUE.HISTORY_ID,
ROUND(VALUE.DAILY_FEE * VALUE.PERIOD *
(100 - IFNULL(PLAN.DISCOUNT_RATE,0)) / 100) AS FEE
FROM VALUE
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
ON PLAN.DURATION_TYPE = VALUE.DURATION_TYPE
AND PLAN.CAR_TYPE = VALUE.CAR_TYPE
ORDER BY 2 DESC, 1 DESC
โญ 3. ์ ๋ต์ฝ๋
WITH VALUE AS (
SELECT CAR.DAILY_FEE, CAR.CAR_TYPE, HISTORY.HISTORY_ID,
DATEDIFF(END_DATE, START_DATE) + 1 AS PERIOD,
CASE
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 90 THEN '90์ผ ์ด์'
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 30 THEN '30์ผ ์ด์'
WHEN DATEDIFF(END_DATE, START_DATE) + 1 >= 7 THEN '7์ผ ์ด์'
ELSE ''
END AS DURATION_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HISTORY
INNER JOIN CAR_RENTAL_COMPANY_CAR AS CAR ON CAR.CAR_ID = HISTORY.CAR_ID
WHERE CAR.CAR_TYPE = 'ํธ๋ญ')
SELECT VALUE.HISTORY_ID,
ROUND(VALUE.DAILY_FEE * VALUE.PERIOD *
(100 - IFNULL(PLAN.DISCOUNT_RATE,0)) / 100) AS FEE
FROM VALUE
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
ON PLAN.DURATION_TYPE = VALUE.DURATION_TYPE
AND PLAN.CAR_TYPE = VALUE.CAR_TYPE
ORDER BY 2 DESC, 1 DESC
๐ TMI
lv 4 ๋ฌธ์ ๋ผ์ ์ด๋ ต๊ธด ์ด๋ ต๋ค