DB/ORACLE

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

고진_감래 2024. 7. 28. 02:48

# 구하고자 하는 것
-- 세단, SUV인 자동차들 중에서
-- 2022/11/1 ~ 2022/11/30 까지 대여가 가능하고
-- 30일간의 대여 금액이 50만원 이상, 200만원 미만인 자동차
-- 대여 금액을 기준으로 내림차순 정렬, 자동차 종류 오름차순, 자동차 ID 내림차순


# 처음 생각한 것

대여기록테이블에서 세단, SUV자동차이면서 11월달에 예약이 안되어있는 차량들을 구했다.

하지만 이렇게되면 CAR_ID가 중복되는 차량이 많이 나오기 때문에 안됨!

 

아래처럼 해서 틀렸다.

세단, SUV조건도 없고, 아래처럼하면 동일한 데이터가 여러행이 나온다.

SELECT HISTORY.CAR_ID CAR_ID, CAR.CAR_TYPE CAR_TYPE, CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100 FEE
  FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY HISTORY, CAR_RENTAL_COMPANY_CAR CAR, CAR_RENTAL_COMPANY_DISCOUNT_PLAN PLAN
 WHERE HISTORY.CAR_ID = CAR.CAR_ID(+)
   AND CAR.CAR_TYPE = PLAN.CAR_TYPE(+)
   AND PLAN.DURATION_TYPE = '30일 이상' 
   AND ((START_DATE <= TO_DATE('2022-11-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
        AND END_DATE <= TO_DATE('2022-11-01 00:00:00','YYYY-MM-DD HH24:MI:SS')) OR
        (START_DATE >= TO_DATE('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS')
        AND END_DATE >= TO_DATE('2022-11-30 00:00:00','YYYY-MM-DD HH24:MI:SS')))
   AND CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100 >= 500000
   AND CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100 < 2000000
ORDER BY FEE DESC, CAR.CAR_TYPE, CAR.CAR_ID DESC;

 

 

# 정답

SELECT CAR.CAR_ID CAR_ID,
       CAR.CAR_TYPE CAR_TYPE,
       CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100 FEE
  FROM CAR_RENTAL_COMPANY_CAR CAR, CAR_RENTAL_COMPANY_DISCOUNT_PLAN PLAN
   WHERE CAR.CAR_TYPE = PLAN.CAR_TYPE(+)
   AND PLAN.DURATION_TYPE = '30일 이상' 
   AND CAR.CAR_TYPE IN ('세단', 'SUV')
   AND CAR.CAR_ID NOT IN (
        SELECT DISTINCT CAR_ID
          FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
         WHERE (START_DATE < TO_DATE('2022-11-30 23:59:59', 'YYYY-MM-DD HH24:MI:SS')
           AND END_DATE > TO_DATE('2022-11-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS'))
    )
   AND (CAR.DAILY_FEE * (100 - PLAN.DISCOUNT_RATE) / 100) * 30 >= 500000
   AND (CAR.DAILY_FEE * (100 - PLAN.DISCOUNT_RATE) / 100) * 30 < 2000000
ORDER BY FEE DESC, CAR.CAR_TYPE ASC, CAR.CAR_ID DESC;

CAR_ID를 구할 때 DISTINCT로 중복을 제거하고, 조건을 시작날짜가 11월 30일보다 작으면서 종료날짜가 11월 1일보다 큰 경우가 아닐때를 구한다. 내가 위에서 짰던 날짜코드는 예외가 너무 많이 존재했다. 중복데이터 생각하기!!

 

다음에 다시 또 풀어봐야될듯