Home

자동차 대여 기록 별 대여 금액 구하기

Link

Tables

erDiagram
	CAR_RENTAL_COMPANY_CAR {
		CAR_ID INTEGER PK
		CAR_TYPE VARCHAR "세단, SUV, 승합차, 트럭, 리무진"
		DAILY_FEE INTEGER
		OPTIONS VARCHAR
	}
	CAR_RENTAL_COMPANY_RENTAL_HISTORY {
		HISTORY_ID INTEGER PK
		CAR_ID INTEGER FK
		START_DATE DATE
		END_DATE DATE
	}
	CAR_RENTAL_COMPANY_DISCOUNT_PLAN {
		PLAN_ID INTEGER PK
		CAR_TYPE VARCHAR
		DURATION_TYPE VARCHAR
		DISCOUNT_RATE INTEGER
	}
	CAR_RENTAL_COMPANY_CAR ||--o{ CAR_RENTAL_COMPANY_RENTAL_HISTORY : Rent_History
	CAR_RENTAL_COMPANY_CAR ||--|{ CAR_RENTAL_COMPANY_DISCOUNT_PLAN : Discount_Plan
Mermaid
복사

Question

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.

DataFlow

대여 날짜에 따라서 달라지는 discount plan 적용
diff_date 사용 + 1
할인후 총액 정수 출력
7일 미만 할인률 0

Answer

WITH t_his AS ( SELECT h.*, t.CAR_TYPE, t.DAILY_FEE, DATEDIFF(h.END_DATE, h.START_DATE) + 1 AS days, CASE WHEN DATEDIFF(h.END_DATE, h.START_DATE) + 1 < 7 THEN "7일 미만" WHEN DATEDIFF(h.END_DATE, h.START_DATE) + 1 < 30 THEN "7일 이상" WHEN DATEDIFF(h.END_DATE, h.START_DATE) + 1 < 90 THEN "30일 이상" ELSE "90일 이상" END AS dur_days FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h JOIN ( SELECT * FROM CAR_RENTAL_COMPANY_CAR WHERE CAR_TYPE = "트럭" ) t ON h.CAR_ID = t.CAR_ID ), result AS ( SELECT h.*, CASE WHEN p.DURATION_TYPE IS NULL THEN "7일 미만" ELSE p.DURATION_TYPE END AS DURATION_TYPE, CASE WHEN p.DISCOUNT_RATE IS NULL THEN 0 ELSE p.DISCOUNT_RATE * 0.01 END AS DISCOUNT_RATE FROM t_his h LEFT JOIN ( SELECT * FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN WHERE CAR_TYPE = "트럭" ) p ON h.CAR_TYPE = p.CAR_TYPE AND p.DURATION_TYPE = h.dur_days ) SELECT HISTORY_ID, TRUNCATE((DAILY_FEE * (1-DISCOUNT_RATE)) * days, 0) AS FEE FROM result ORDER BY FEE DESC, HISTORY_ID DESC;
SQL
복사