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

2023. 3. 16. 00:24DataBase/SQL Query Problem

728x90
반응형
SMALL

많이 어려운 문제였다.

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

 

그동안 다른 문제들을 풀면서 '내가 새로운 결과를 갖고 있는 테이블을 만들어서 이를 참조할 순 없을까?' 라는 생각을 많이 했다. 그러나 그럴 때마다 그냥 서브 쿼리로 풀려서 더이상 알아보지 않고 그냥 넘어갔었다.

그런데 이번엔 도저히 풀리지 않아서 한 번 알아봤는데 있다.ㅋㅋㅋ

 

with절을 사용해서 나만의 테이블을 만들 수 있다.

WITH DATA AS (
    SELECT
        R.HISTORY_ID, R.CAR_ID, C.DAILY_FEE, C.CAR_TYPE, DATEDIFF(R.END_DATE, R.START_DATE) + 1 DURATION, (
            CASE
            WHEN DATEDIFF(R.END_DATE, R.START_DATE) + 1 >= 90 THEN '90일 이상'
            WHEN DATEDIFF(R.END_DATE, R.START_DATE) + 1 >= 30 THEN '30일 이상'
            WHEN DATEDIFF(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 '트럭'
)

나는 위와 같이 트럭인 대여 기록들에 대해 대여 기간과 그에 따른 대여기간타입을 정한 DATA 라는 테이블을 만들었다.

 

이렇게 만들고나면 다른 테이블과 마찬가지로 참조할 수 있다.

이 테이블 하나 만들었다고 문제가 엄청 간단해졌다.

앞으로도 엄청 유용하게 사용할 것 같다.

 


정답

WITH DATA AS (
    SELECT
        R.HISTORY_ID, R.CAR_ID, C.DAILY_FEE, C.CAR_TYPE, DATEDIFF(R.END_DATE, R.START_DATE) + 1 DURATION, (
            CASE
            WHEN DATEDIFF(R.END_DATE, R.START_DATE) + 1 >= 90 THEN '90일 이상'
            WHEN DATEDIFF(R.END_DATE, R.START_DATE) + 1 >= 30 THEN '30일 이상'
            WHEN DATEDIFF(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 - IFNULL(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