[PS] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기⭐

szlee·2024년 10월 29일
0

MySQL

목록 보기
16/16

특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

with available_car as (
select
    C.car_id
    , C.car_type
    , duration_type
    , discount_rate
    , daily_fee
    , round(daily_fee*(100-discount_rate)*0.01*30) as fee
from CAR_RENTAL_COMPANY_CAR C
    join CAR_RENTAL_COMPANY_RENTAL_HISTORY H on C.car_id = H.car_id
    join CAR_RENTAL_COMPANY_DISCOUNT_PLAN P on C.car_type = P.car_type
where C.car_type in ('세단', 'SUV')
    and C.car_id not in (
        select car_id
        from CAR_RENTAL_COMPANY_RENTAL_HISTORY
        where not (start_date > '2022-11-30' or end_date < ' 2022-11-01')
    )
    and duration_type like '30일 이상%'
group by C.car_id
)

select
    car_id
    , car_type
    , fee
from
    available_car
where fee >= 500000 and fee < 2000000
order by fee desc, car_type, car_id desc

available_car절의 where 조건절이 중요하다.

where ...
    and C.car_id not in (
        select car_id
        from CAR_RENTAL_COMPANY_RENTAL_HISTORY
        where not (start_date > '2022-11-30' or end_date < ' 2022-11-01')
        ...

not in ~ not
명시한 기간 조건이 아닌 car_id를 뽑고, 또 이 car_id에 속하지 않는 car_id가 최종적으로 구해야 하는 값이다.

말이 너무 헷갈린다^^;
그냥 대충 이중부정 = 긍정 아님?

C.car_id in (
        select car_id
        from CAR_RENTAL_COMPANY_RENTAL_HISTORY
        where (start_date > '2022-11-30' or end_date < ' 2022-11-01')

이렇게 하면 다른 결과가 나온다.

첫번째 케이스는, 11월에 대여가 불가능한 차를 모두 찾고 이를 제외한다.
두번째 케이스는, 11월에 대여가 가능한 차를 모두 찾는다.

이렇게 보면 똑같은 말이라고 생각할 수 있지만,

history_idcar_idstart_dateend_date
603182022-09-06 00:00:002022-09-07 00:00:00
609182022-09-09 00:00:002022-09-12 00:00:00
619182022-09-13 00:00:002022-09-15 00:00:00
629182022-09-16 00:00:002022-10-16 00:00:00
694182022-10-19 00:00:002022-10-19 00:00:00
700182022-10-21 00:00:002022-10-22 00:00:00
712182022-10-25 00:00:002023-01-26 00:00:00
508272022-08-01 00:00:002022-08-02 00:00:00
512272022-08-03 00:00:002022-08-04 00:00:00
521272022-08-05 00:00:002022-08-06 00:00:00
536272022-08-09 00:00:002022-08-16 00:00:00
576272022-08-24 00:00:002022-09-23 00:00:00
660272022-09-25 00:00:002022-12-24 00:00:00

car_id 18의 history_id 712, card_id 27의 history_id 660 은 대여가 불가능하다. 하나라도 대여 불가능한 이력이 있으면 그 차는 대여가 불가능한 것이다.

따라서 첫번째 케이스에서는 이를 방지해주지만,
두번째 케이스에서는 가능한 것이 하나라도 있으면 포함이기 때문에
전혀 다른 결과를 내는 것이다.

profile
🌱

0개의 댓글