[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기_Oracle

2023. 4. 18. 14:41DataBase/SQL Query Problem

728x90
반응형
SMALL

mysql과 oracle의 풀이방법에 차이가 거의 없기 때문에

자세한 풀이 방법은

https://tldnjs0821.tistory.com/203

 

[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기_MySQL

많이 어려운 문제였다. 3개의 테이블을 모두 한번에 조인해서 풀려고 시도했는데 대여 기간이 7일 미만인 대여 기록을 처리할 수가 없어서 엄청 고민했다. 그러다 with절이라는 엄청난 놈을 알게

tldnjs0821.tistory.com

위 url을 참고하기 바란다.

 

이 문제에서 mysql의 정답과 oracle의 정답의 차이점은 IFNULL함수와 역시나 date타입의 연산이 있다.

mysql에는 IFNULL함수가 있고 oracle에는 NVL함수가 있다.

두 함수 모두 인자로 컬럼명과 값을 하나 받으면 해당 컬럼이 널일 경우 인자로 준 값을 반환한다.

 

date타입의 연산 같은 경우에는 oracle에서는 datediff함수가 없고 그냥 date타입끼리 -(sub)연산하면 된다.

 


정답

WITH DATA AS (
    SELECT
        R.HISTORY_ID, R.CAR_ID, C.DAILY_FEE, C.CAR_TYPE, R.END_DATE - R.START_DATE + 1 DURATION, (
            CASE
            WHEN R.END_DATE - R.START_DATE + 1 >= 90 THEN '90일 이상'
            WHEN R.END_DATE - R.START_DATE + 1 >= 30 THEN '30일 이상'
            WHEN R.END_DATE - R.START_DATE + 1 >= 7 THEN '7일 이상'
            ELSE '7일 미만'
            END
        ) DURATION_TYPE
    FROM
        CAR_RENTAL_COMPANY_CAR C
        INNER JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY R
    ON
        C.CAR_ID = R.CAR_ID
    WHERE
        C.CAR_TYPE LIKE '트럭'
)

SELECT
    DATA.HISTORY_ID, (
        ROUND(DATA.DAILY_FEE * DATA.DURATION * (100 - NVL(D.DISCOUNT_RATE, 0)) * 0.01, 0)
    ) FEE
FROM
    DATA LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN D
ON
    DATA.CAR_TYPE = D.CAR_TYPE
    AND DATA.DURATION_TYPE = D.DURATION_TYPE
ORDER BY FEE DESC, DATA.HISTORY_ID DESC;
728x90
반응형
LIST