1. quiz
- CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
2. answer
SELECT B.history_id
,CASE
WHEN DATEDIFF(end_date,start_date)+1 < 7
THEN sum(daily_fee*(DATEDIFF(end_date,start_date)+1))
WHEN DATEDIFF(end_date,start_date)+1 >=7
AND DATEDIFF(end_date,start_date)+1 < 30
THEN round((sum(daily_fee*(DATEDIFF(end_date,start_date)+1))*0.95))
WHEN DATEDIFF(end_date,start_date)+1 >=30
AND DATEDIFF(end_date,start_date)+1 < 90
THEN round((sum(daily_fee*(DATEDIFF(end_date,start_date)+1))*0.93))
WHEN DATEDIFF(end_date,start_date)+1 >=90
THEN round((sum(daily_fee*(DATEDIFF(end_date,start_date)+1)) *0.9))
END AS FEE
FROM CAR_RENTAL_COMPANY_CAR A JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
ON A.car_id = B.car_id
WHERE A.car_type = '트럭'
GROUP BY B.history_id
ORDER BY FEE DESC, history_id DESC;
SELECT history_id
, ROUND(CASE WHEN rental_date < 7 THEN rental_date * daily_fee
WHEN rental_date < 30 THEN rental_date * daily_fee * 0.95
WHEN rental_date < 90 THEN rental_date * daily_fee * 0.92
ELSE rental_date * daily_fee * 0.85 END,0) FEE
FROM (
SELECT history_id,car_id, (DATEDIFF(end_date, start_date)+1) rental_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE car_id in (
SELECT car_id
FROM CAR_RENTAL_COMPANY_CAR
WHERE car_type = '트럭')
) ta
LEFT
JOIN CAR_RENTAL_COMPANY_CAR
USING (CAR_ID)
ORDER BY 2 DESC, 1 DESC
- 나는 한꺼번에 조인을 해서 큰 테이블로 만들어서 해결하려는 습성이 있다. 이를 좀 개선할 필요가 있다.