[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기_Oracle
2023. 4. 18. 14:41ㆍDataBase/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
'DataBase > SQL Query Problem' 카테고리의 다른 글
| [프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기_Oracle (0) | 2023.04.17 |
|---|---|
| [프로그래머스] 있었는데요 없었습니다_Oracle, MySQL (0) | 2023.04.15 |
| [프로그래머스] 오랜 기간 보호한 동물(1)_MySQL (0) | 2023.04.14 |
| [프로그래머스] 오랜 기간 보호한 동물(2)_MySQL (0) | 2023.04.13 |
| [프로그래머스] 조건별로 분류하여 주문상태 출력하기_Oracle (0) | 2023.04.11 |