SQL

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค level 4] ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก๋ณ„ ๋Œ€์—ฌ ๊ธˆ์•ก ๊ตฌํ•˜๊ธฐ

1eehyunji 2023. 8. 11. 21:50

๋ฌธ์ œ ์„ค๋ช…

๋‹ค์Œ์€ ์–ด๋А ์ž๋™์ฐจ ๋Œ€์—ฌ ํšŒ์‚ฌ์—์„œ ๋Œ€์—ฌ ์ค‘์ธ ์ž๋™์ฐจ๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ 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๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์„œ ์ถœ๋ ฅํ•œ๋‹ค.