๋ฌธ์
- ํ๋ก๊ทธ๋๋จธ์ค SQL ๋ฌธ์
์๋์ฐจ ๋์ฌ ๊ธฐ๋ก ๋ณ ๋์ฌ ๊ธ์ก ๊ตฌํ๊ธฐ
/๋ ๋ฒจ 4
- ๋ฌธ์ ๋ด์ฉ : ํ๋จ ํ๋ก๊ทธ๋๋จธ์ค ๋ฌธ์ [๋งํฌ]
๋ด๊ฐ ์์ฑํ Query
WITH TEMP_01 AS( SELECT A.HISTORY_ID, DATEDIFF(A.END_DATE, A.START_DATE) + 1 AS DAYS , CASE WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 90 THEN '90์ผ ์ด์' WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 30 THEN '30์ผ ์ด์' WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 7 THEN '7์ผ ์ด์' END AS DURATION , B.CAR_TYPE, B.DAILY_FEE FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY A JOIN CAR_RENTAL_COMPANY_CAR B ON A.CAR_ID = B.CAR_ID WHERE B.CAR_TYPE = 'ํธ๋ญ' ) SELECT A.HISTORY_ID , ROUND((DAILY_FEE * (1-COALESCE(B.DISCOUNT_RATE, 0)/100))*A.DAYS, 0) AS FEE FROM TEMP_01 A LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN B ON A.CAR_TYPE = B.CAR_TYPE AND A.DURATION = B.DURATION_TYPE ORDER BY FEE DESC, HISTORY_ID DESC
์ฐจ๋ ๋์ฌ ์ ๋ณด ํ
์ด๋ธ๊ณผ(CAR_RENTAL_COMPANY_RENTAL_HISTORY
), ์ฐจ๋์ ๋ณด ํ
์ด๋ธ (CAR_RENTAL_COMPANY_CAR
)์ 'CAR_ID' ๊ธฐ์ค์ผ๋ก JOIN
ํด์ค๋ค.
WHERE
์ ์ ์๋์ฐจ ์ข
๋ฅ(CAR_TYPE
)๊ฐ 'ํธ๋ญ'์ธ ๋ฐ์ดํฐ๋ง ํํฐ๋งํ๋ค.
DATEDIFF(A.END_DATE, A.START_DATE) + 1
์ ์ด์ฉํด ๋์ฌ ์ผ์๋ฅผ ๊ตฌํด์ฃผ๊ณ ์ด๋ฅผ ๊ธฐ์ค์ผ๋ก '90์ผ ์ด์', '30์ผ ์ด์', '7์ผ ์ด์'์ DURATION
์ ๋ณด๋ฅผ CASE WHEN THEN
์ ์ด์ฉํด ๊ตฌํ๋ค.(๋์ฌ์ผ, ๋ฐ๋ฉ์ผ ๋ชจ๋ ๋์ฌ๊ธฐ๊ฐ์ ํฌํจ๋์ด์ผ ํ๋ฏ๋ก, ์ ๊ฒฝ๊ณ๊ฐ ํฌํจํ๊ธฐ ์ํด +1 ํด์ค)
์์์ ๊ตฌํ ํ
์ด๋ธ์ TEMP_01
๋ก ๋ง๋ ๋ค.
TEMP_01
ํ
์ด๋ธ๊ณผ ํ ์ธ ์ ๋ณด๊ฐ ํฌํจ๋ CAR_RENTAL_COMPANY_DISCOUNT_PLAN
ํ
์ด๋ธ์ CAR_TYPE
๊ณผ ์์์ CASE
๋ฌธ์ผ๋ก ๊ตฌํ DURATION
์ ๊ธฐ์ค์ผ๋ก LEFT JOIN
ํด ์ค๋ค.
๐๐๐(์ LEFT JOIN
์ธ๊ฐ? : 7์ผ ์ดํ์ ๋์ฌ ๊ธฐ๋ก๋ ๊ตฌํด์ผ ํ๋๊น LEFT JOIN
์ด๋ค. CAR_RENTAL_COMPANY_DISCOUNT_PLAN
์๋ 7์ผ ์ดํ์ ํ ์ธ์ ๋ณด๋ ์๊ธฐ ๋๋ฌธ์ ๊ทธ๋ฅ JOIN
์ ํ ๊ฒฝ์ฐ 7์ผ ์ดํ์ ๋์ฌ๊ธฐ๋ก์ด ํฌํจ๋์ง ์๋๋ค.)
๊ฐ DURATION
์ ๋ง๋ ํ ์ธ์จ(DISCOUNT_RATE
)๋ฅผ ๋ฐ์ํ ๊ฐ๊ฒฉ์ ๊ตฌํด์ค๋ค.
DAILY_FEE*(1-COALESCE(DISCOUNT_RATE, 0)/100)*DAYS
๋ฅผ ํตํด ๊ฐ ํ ์ธ์จ์ ๋ฐ์ํ ์ผ๋ณ ์๊ธ์ ๊ตฌํ๊ณ , ๋์ฌ ์ผ์๋ฅผ ๊ณฑํด์ค๋ค. COALESCE
๋ฅผ ์ฌ์ฉํ์๊ธฐ ๋๋ฌธ์ ํ ์ธ์จ์ด ์๋ ๋ฐ์ดํฐ(์ฆ, 7์ผ ๋ฏธ๋ง์ ๋์ฌ๊ธฐ๋ก)๋ ํ ์ธ์ด ์๋ ๊ธ์ก์ ๊ตฌํ๊ฒ ๋๋ค.
์์์ ๊ตฌํ ์ด ์๊ธ ์ปฌ๋ผ์ FEE
์ปฌ๋ผ์ผ๋ก ๋ณ์นญ ์ค๋ค.
ORDER BY
๋ฅผ ์ด์ฉํด FEE
, HISTORY_ID
๊ธฐ์ค์ผ๋ก ๋ด๋ฆผ์ฐจ์ ์ ๋ ฌํ๋ค.
๐๐๐ 1) LEFT JOIN
๊ณผ JOIN
์ ๋น๊ต,
2) CASE WHEN THEN
์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ์์,
3) DAFE_DIFF
๋ฅผ ํตํด ์ ํํ ๋์ฌ ์ผ์๋ฅผ ๊ตฌํ๋ ๋ฒ
4) COALESCE
ํจ์๋ฅผ ํตํด NULL
๊ฐ์ ๋ํ ์ฒ๋ฆฌ
5) TEMP_01
๋ฑ ์์ ํ
์ด๋ธ์ ํตํด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ
๋ชจ๋ ๊ฒ์ ๋ฐฐ์ธ ์ ์๋ ๋ฌธ์ ์๋ค. ์ค์์ค์!