프로그래머스 Lv4. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

2023. 8. 17. 21:20SQL/SQL 테스트 연습

 

문제 설명

 

다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 CAR_RENTAL_COMPANY_CAR 테이블과 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 자동차 종류별 대여 기간 종류별 할인 정책 정보를 담은 CAR_ RENTAL_COMPANY_DISCOUNT_PLAN 테이블입니다. CAR_RENTAL_COMPANY_CAR 테이블은 아래와 같은 구조로 되어있으며, CAR_ID, CAR_TYPE, DAILY_FEE, OPTIONS 는 각각 자동차 ID, 자동차 종류, 일일 대여 요금(원), 자동차 옵션 리스트를 나타냅니다.

 

Column name Type Nullable
CAR_ID INTEGER FALSE
CAR_TYPE VARCHAR(255) FALSE
DAILY_FEE INTEGER FALSE
OPTIONS VARCHAR(255) FALSE

 

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(', ')로 구분된 키워드 리스트(예: ''열선시트, 스마트키, 주차감지센서'')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '내비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트'가 있습니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID,  CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

 

문제 풀이

 

SELECT 
    c.CAR_ID, 
    c.CAR_TYPE, 
    ROUND(c.DAILY_FEE * (1 - d.DISCOUNT_RATE / 100.0) * 30) AS FEE
FROM 
    CAR_RENTAL_COMPANY_CAR c
LEFT JOIN 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY h ON c.CAR_ID = h.CAR_ID AND 
    (h.START_DATE <= '2022-11-30' AND h.END_DATE >= '2022-11-01')
LEFT JOIN 
    CAR_RENTAL_COMPANY_DISCOUNT_PLAN d ON c.CAR_TYPE = d.CAR_TYPE AND d.DURATION_TYPE = '30일 이상'
WHERE 
    c.CAR_TYPE IN ('세단', 'SUV') AND
    h.CAR_ID IS NULL
HAVING 
    FEE >= 500000 AND FEE < 2000000
ORDER BY 
    FEE DESC, 
    c.CAR_TYPE, 
    c.CAR_ID DESC;
  • SELECT:
    • c.CAR_ID: 차량의 ID
    • c.CAR_TYPE: 차량의 유형
    • ROUND(c.DAILY_FEE * (1 - d.DISCOUNT_RATE / 100.0) * 30) AS FEE: 차량의 일별 임대료를 바탕으로 한 월 임대료. 할인율이 적용된다면 그에 따른 할인 금액을 차감하여 계산합니다.
  • FROM:
    • CAR_RENTAL_COMPANY_CAR c: 차량 정보 테이블
  • LEFT JOIN:
    • CAR_RENTAL_COMPANY_RENTAL_HISTORY h: 차량 임대 기록 테이블. c.CAR_ID와 일치하는 데이터를 찾아 연결하며, 특정 날짜 조건 (2022-11-01부터 2022-11-30 사이)에 대한 임대 기록이 있는지 확인합니다.
    • CAR_RENTAL_COMPANY_DISCOUNT_PLAN d: 차량 유형별 할인 계획 테이블. c.CAR_TYPE와 일치하며, 30일 이상 대여에 해당하는 할인율 데이터를 찾아 연결합니다.
  • WHERE:
    • 차량 유형이 '세단' 또는 'SUV'인 경우만 선택합니다.
    • 위에서 LEFT JOIN 한 임대 기록 테이블에서 해당 차량에 대한 11월 임대 기록이 없는 경우만 선택합니다.
  • HAVING:
    • 계산된 월 임대료(FEE)가 500,000 이상 2,000,000 미만인 경우만 선택합니다.
  • ORDER BY:
    • 월 임대료를 내림차순으로 정렬합니다.
    • 그 후 차량 유형으로 정렬합니다.
    • 마지막으로 차량 ID를 내림차순으로 정렬합니다.