๐Ÿ–ฅ๏ธ ์ฝ”๋”ฉํ…Œ์ŠคํŠธ/SQL

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] [SQL] ํŠน์ • ๊ธฐ๊ฐ„๋™์•ˆ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•œ ์ž๋™์ฐจ๋“ค์˜ ๋Œ€์—ฌ๋น„์šฉ ๊ตฌํ•˜๊ธฐ

rtw0202 2026. 2. 17. 13:31

1. ๋ฌธ์ œ ์„ค๋ช…

๋‹ค์Œ์€ ์–ด๋А ์ž๋™์ฐจ ๋Œ€์—ฌ ํšŒ์‚ฌ์—์„œ ๋Œ€์—ฌ ์ค‘์ธ ์ž๋™์ฐจ๋“ค์˜ ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”๊ณผ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”๊ณผ ์ž๋™์ฐจ ์ข…๋ฅ˜ ๋ณ„ ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ์ข…๋ฅ˜ ๋ณ„ ํ• ์ธ ์ •์ฑ… ์ •๋ณด๋ฅผ ๋‹ด์€ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์ž…๋‹ˆ๋‹ค.

CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, CAR_IDCAR_TYPEDAILY_FEEOPTIONS๋Š” ๊ฐ๊ฐ ์ž๋™์ฐจ ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ์ผ์ผ ๋Œ€์—ฌ ์š”๊ธˆ(์›), ์ž๋™์ฐจ ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์ž๋™์ฐจ ์ข…๋ฅ˜๋Š” '์„ธ๋‹จ', 'SUV', '์Šนํ•ฉ์ฐจ', 'ํŠธ๋Ÿญ', '๋ฆฌ๋ฌด์ง„' ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™์ฐจ ์˜ต์…˜ ๋ฆฌ์ŠคํŠธ๋Š” ์ฝค๋งˆ(',')๋กœ ๊ตฌ๋ถ„๋œ ํ‚ค์›Œ๋“œ ๋ฆฌ์ŠคํŠธ(์˜ˆ: ''์—ด์„ ์‹œํŠธ,์Šค๋งˆํŠธํ‚ค,์ฃผ์ฐจ๊ฐ์ง€์„ผ์„œ'')๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, ํ‚ค์›Œ๋“œ ์ข…๋ฅ˜๋Š” '์ฃผ์ฐจ๊ฐ์ง€์„ผ์„œ', '์Šค๋งˆํŠธํ‚ค', '๋„ค๋น„๊ฒŒ์ด์…˜', 'ํ†ตํ’์‹œํŠธ', '์—ด์„ ์‹œํŠธ', 'ํ›„๋ฐฉ์นด๋ฉ”๋ผ', '๊ฐ€์ฃฝ์‹œํŠธ' ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, HISTORY_ID, CAR_ID, START_DATE, END_DATE๋Š” ๊ฐ๊ฐ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ID, ์ž๋™์ฐจ ID, ๋Œ€์—ฌ ์‹œ์ž‘์ผ, ๋Œ€์—ฌ ์ข…๋ฃŒ์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ, HISTORY_IDCAR_IDSTART_DATEEND_DATE๋Š” ๊ฐ๊ฐ ์ž๋™์ฐจ ๋Œ€์—ฌ ๊ธฐ๋ก ID, ์ž๋™์ฐจ ID, ๋Œ€์—ฌ ์‹œ์ž‘์ผ, ๋Œ€์—ฌ ์ข…๋ฃŒ์ผ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์€ ์•„๋ž˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ๋กœ ๋˜์–ด์žˆ์œผ๋ฉฐ,  PLAN_ID, CAR_TYPE, DURATION_TYPE, DISCOUNT_RATE๋Š” ๊ฐ๊ฐ ์š”๊ธˆ ํ• ์ธ ์ •์ฑ… ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ์ข…๋ฅ˜, ํ• ์ธ์œจ(%)์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

ํ• ์ธ์œจ์ด ์ ์šฉ๋˜๋Š” ๋Œ€์—ฌ ๊ธฐ๊ฐ„ ์ข…๋ฅ˜๋กœ๋Š” '7์ผ ์ด์ƒ' (๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 7์ผ ์ด์ƒ 30์ผ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ), '30์ผ ์ด์ƒ' (๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 30์ผ ์ด์ƒ 90์ผ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ), '90์ผ ์ด์ƒ' (๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 90์ผ ์ด์ƒ์ธ ๊ฒฝ์šฐ) ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์—ฌ ๊ธฐ๊ฐ„์ด 7์ผ ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ ํ• ์ธ์ •์ฑ…์ด ์—†์Šต๋‹ˆ๋‹ค.

CAR_RENTAL_COMPANY_CAR ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_RENTAL_HISTORY ํ…Œ์ด๋ธ”๊ณผ CAR_RENTAL_COMPANY_DISCOUNT_PLAN ํ…Œ์ด๋ธ”์—์„œ ์ž๋™์ฐจ ์ข…๋ฅ˜๊ฐ€ '์„ธ๋‹จ' ๋˜๋Š” 'SUV' ์ธ ์ž๋™์ฐจ ์ค‘ 2022๋…„ 11์›” 1์ผ๋ถ€ํ„ฐ 2022๋…„ 11์›” 30์ผ๊นŒ์ง€ ๋Œ€์—ฌ ๊ฐ€๋Šฅํ•˜๊ณ  30์ผ๊ฐ„์˜ ๋Œ€์—ฌ ๊ธˆ์•ก์ด 50๋งŒ์› ์ด์ƒ 200๋งŒ์› ๋ฏธ๋งŒ์ธ ์ž๋™์ฐจ์— ๋Œ€ํ•ด์„œ ์ž๋™์ฐจ ID, ์ž๋™์ฐจ ์ข…๋ฅ˜, ๋Œ€์—ฌ ๊ธˆ์•ก(์ปฌ๋Ÿผ๋ช…: FEE) ๋ฆฌ์ŠคํŠธ๋ฅผ ์ถœ๋ ฅํ•˜๋Š” SQL๋ฌธ์„ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”. ๊ฒฐ๊ณผ๋Š” ๋Œ€์—ฌ ๊ธˆ์•ก์„ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•˜๊ณ , ๋Œ€์—ฌ ๊ธˆ์•ก์ด ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ์ข…๋ฅ˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์˜ค๋ฆ„์ฐจ์ˆœ ์ •๋ ฌ, ์ž๋™์ฐจ ์ข…๋ฅ˜๊นŒ์ง€ ๊ฐ™์€ ๊ฒฝ์šฐ ์ž๋™์ฐจ ID๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚ด๋ฆผ์ฐจ์ˆœ ์ •๋ ฌํ•ด์ฃผ์„ธ์š”.

 

2. ์ถœ๋ ฅ ์˜ˆ์‹œ

 

3. ๋ฌธ์ œ ๋‹ต์•ˆ

SELECT *
FROM (
    SELECT
        c.car_id,
        c.car_type,
        ROUND(c.daily_fee * (100 - p.discount_rate) * 30 / 100) AS fee
    FROM car_rental_company_car c
    JOIN car_rental_company_discount_plan p
    ON c.car_type = p.car_type AND
       p.duration_type = '30์ผ ์ด์ƒ'
    WHERE c.car_type IN ('์„ธ๋‹จ', 'SUV')
      AND NOT EXISTS ( # ์•„์˜ˆ ๋Œ€์—ฌ ๊ธฐ๋ก์ด ์—†์–ด๋„ ํ†ต๊ณผ
          SELECT 1
          FROM car_rental_company_rental_history h
          WHERE h.car_id = c.car_id AND 
                h.start_date <= '2022-11-30' AND # ๋‚ ์งœ ๊ฒน์น˜๋Š” ์กฐ๊ฑด
                h.end_date >= '2022-11-01'
      )
) t
# 30์ผ๊ฐ„ ๋Œ€์—ฌ๊ธˆ์•ก
WHERE t.fee >= 500000 AND t.fee < 2000000
ORDER BY t.fee DESC, t.car_type ASC, t.car_id DESC;