- CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
SELECT history_id
, round(daily_fee *
(datediff(end_date, start_date) + 1) *
COALESCE(1 - (discount_rate * .01),1)
,0) AS fee
FROM
(SELECT h.history_id, h.car_id, c.car_type, c.daily_fee, h.end_date, h.start_date,
CASE WHEN datediff(h.end_date, h.start_date) + 1 BETWEEN 7 AND 29 THEN '7일 이상'
WHEN datediff(h.end_date, h.start_date) + 1 BETWEEN 30 AND 89 THEN '30일 이상'
WHEN datediff(h.end_date, h.start_date) + 1 >= 90 THEN '90일 이상'
ELSE null END AS duration_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
JOIN CAR_RENTAL_COMPANY_CAR c
ON c.car_id = h.car_id) a
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
ON a.car_type = p.car_type
AND a.duration_date = p.duration_type
WHERE a.car_type = '트럭'
ORDER BY fee DESC, history_id DESC;
① (SELECT h.history_id, h.car_id, c.car_type, c.daily_fee, h.end_date, h.start_date,
CASE WHEN datediff(h.end_date, h.start_date) + 1 BETWEEN 7 AND 29 THEN '7일 이상'
WHEN datediff(h.end_date, h.start_date) + 1 BETWEEN 30 AND 89 THEN '30일 이상'
WHEN datediff(h.end_date, h.start_date) + 1 >= 90 THEN '90일 이상'
ELSE null END AS duration_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
JOIN CAR_RENTAL_COMPANY_CAR c
ON c.car_id = h.car_id) a
# 대여 기록 별로 대여 금액을 구해야하기 때문에
모든 기록들에 대한 대여기간을 구해준다.
# 7일미만일 경우 NULL 값
# CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블의 경우 7일 이상부터 할인율이 있기 때문에 7일 미만 대여기간도 구해주어야 한다.
② LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
ON a.car_type = p.car_type
AND a.duration_date = p.duration_type
# 대여기간에 대한 정보와 할인율 테이블을 join 시켜주고,
ON 조건절에는 대여기간종류가 일치하는 경우를 포함시켜준다.
③ SELECT history_id
, round(daily_fee *
(datediff(end_date, start_date) + 1) *
COALESCE(1 - (discount_rate * .01),1)
,0) AS fee
# 일일 대여 요금 * 대여기간 * 할인율
# COALESCE(1 - (discount_rate * .01),1)
> discount_rate 가 5% 일때 * .01 을 하게 되면 0.05
> 1- 0.05 = 0.95
> discount_rate 가 NUL 일때에는 *.01 을 하게 되어도 NULL
> NULL 이 아닌 최초의 값을 구하기 때문에 1 이 들어가게 된다.
'SQL 코드카타' 카테고리의 다른 글
197. Rising Temperature (0) | 2024.05.02 |
---|---|
상품을 구매한 회원 비율 구하기 (0) | 2024.04.19 |
특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.04.16 |
입양 시각 구하기(2) #WITH RECURSIVE , SET함수 (0) | 2024.04.11 |
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (0) | 2024.04.09 |