[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기_MySQL
2023. 3. 16. 00:24ㆍDataBase/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
'DataBase > SQL Query Problem' 카테고리의 다른 글
| [프로그래머스] 주문량이 많은 아이스크림들 조회하기_MySQL (0) | 2023.03.17 |
|---|---|
| [프로그래머스] 저자 별 카테고리 별 매출액 집계하기_MySQL (0) | 2023.03.16 |
| [프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기_MySQL (0) | 2023.03.14 |
| [프로그래머스] 조건에 부합하는 중고거래 상태 조회하기_MySQL (0) | 2023.03.13 |
| [프로그래머스] 조건에 부합하는 중고거래 댓글 조회하기_MySQL (0) | 2023.03.13 |