자동차 대여 기록 별 대여 금액 구하기
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요.
결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
1. TRUCK_LIST 테이블 만들기: '트럭'인 자동차의 대여기록에 대한 테이블
WITH TRUCK_LIST AS (
SELECT
HS.HISTORY_ID,
CAR.CAR_TYPE,
-- 날짜 차이 구하기
DATEDIFF(HS.END_DATE, HS.START_DATE) + 1 AS RENTAL_DAYS,
CAR.DAILY_FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HS
JOIN CAR_RENTAL_COMPANY_CAR AS CAR
ON CAR.CAR_ID = HS.CAR_ID
WHERE CAR.CAR_TYPE = '트럭'
)
2. FEE_PLAN 테이블 만들기: 대여기록 별 대여금액에 대한 테이블
FEE_PLAN AS (
SELECT
-- 문자 제거
REPLACE(DURATION_TYPE, '일 이상', '') AS MIN_DAYS,
REPLACE(DISCOUNT_RATE, '%', '') AS DISCOUNT_RATE,
CAR_TYPE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
)
3. 메인 SELECT문
SELECT HISTORY_ID,
MIN(RENTAL_DAYS * DAILY_FEE * (100 - IFNULL(DISCOUNT_RATE, 0)) / 100) AS FEE
FROM TRUCK_LIST TL
LEFT OUTER JOIN FEE_PLAN
ON TL.CAR_TYPE = FEE_PLAN.CAR_TYPE
AND RENTAL_DAYS >= MIN_DAYS
GROUP BY HISTORY_ID
ORDER BY FEE DESC, HISTORY_ID DESC
- LEFT OUTER JOIN:
- TRUCK_LIST와 FEE_PLAN을 연결하여 할인율 가져오기
- RENTAL_DAYS >= MIN_DAYS: 대여 일수가 최소 일수를 충족해야 해당 할인율 적용
- RENTAL_DAYS * DAILY_FEE * (100 - IFNULL(DISCOUNT_RATE, 0)) / 100:
- 대여 일수(RENTAL_DAYS)와 하루 대여 요금(DAILY_FEE)을 곱하여 기본 금액 계산
- 할인율이 적용되면 (100 - DISCOUNT_RATE)로 계산
- 할인율이 없으면(DISCOUNT_RATE가 NULL), 0% 할인으로 처리
- MIN 함수:
- 대여 금액이 여러 할인율 조건에 해당할 경우 가장 낮은 금액 선택
- GROUP BY HISTORY_ID:
- 대여 기록별로 결과 집계
- ORDER BY FEE DESC, HISTORY_ID DESC:
- 대여 금액을 기준으로 내림차순 정렬
- 금액이 같으면 대여 기록 ID를 기준으로 내림차순 정렬
4. 최종 SQL문
WITH TRUCK_LIST AS (
SELECT
HS.HISTORY_ID
, CAR.CAR_TYPE
, DATEDIFF(HS.END_DATE, HS.START_DATE) + 1 AS RENTAL_DAYS
, CAR.DAILY_FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS HS
INNER JOIN CAR_RENTAL_COMPANY_CAR AS CAR
ON CAR.CAR_ID = HS.CAR_ID
WHERE CAR.CAR_TYPE = '트럭'
),
FEE_PLAN AS (
SELECT
REPLACE(DURATION_TYPE, '일 이상', '') AS MIN_DAYS
, REPLACE(DISCOUNT_RATE, '%', '') AS DISCOUNT_RATE
, CAR_TYPE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
)
SELECT HISTORY_ID
, MIN(RENTAL_DAYS * DAILY_FEE * (100-IFNULL(DISCOUNT_RATE,0)) / 100 ) AS FEE
FROM TRUCK_LIST TL
LEFT OUTER JOIN FEE_PLAN
ON TL.CAR_TYPE = FEE_PLAN.CAR_TYPE
AND RENTAL_DAYS >= MIN_DAYS
GROUP BY HISTORY_ID
ORDER BY FEE DESC , HISTORY_ID DESC
'SQL' 카테고리의 다른 글
SQL 코드카타: Invalid Tweets (0) | 2025.01.14 |
---|---|
SQL 코드카타: 상품을 구매한 회원 비율 구하기 (0) | 2025.01.07 |
SQL 코드카타 오답: JOIN과 LEFT JOIN의 중요성 | 여러가지 JOIN 조건 부여하기 | 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (2) | 2024.12.23 |
SQL 코드카타 오답: WITH RECURSIVE() (2) | 2024.12.20 |
QCC 2회차: DISTINCT | <> | CASE WHEN | DATE() (0) | 2024.12.20 |