[프로그래머스/MY SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

고운·2023년 11월 29일

SQL

목록 보기
25/47

문제 설명

다음은 어느 자동차 대여 회사에서 대여 중인 자동차들의 정보를 담은 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 nameTypeNullable
CAR_IDINTEGERFALSE
CAR_TYPEVARCHAR(255)FALSE
DAILY_FEEINTEGERFALSE
OPTIONSVARCHAR(255)FALSE

자동차 종류는 '세단', 'SUV', '승합차', '트럭', '리무진' 이 있습니다. 자동차 옵션 리스트는 콤마(',')로 구분된 키워드 리스트(예: ''열선시트,스마트키,주차감지센서'')로 되어있으며, 키워드 종류는 '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' 가 있습니다.

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

Column nameTypeNullable
HISTORY_IDINTEGERFALSE
CAR_IDINTEGERFALSE
START_DATEDATEFALSE
END_DATEDATEFALSE

CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블은 아래와 같은 구조로 되어있으며, PLAN_ID, CAR_TYPE, DURATION_TYPE, DISCOUNT_RATE 는 각각 요금 할인 정책 ID, 자동차 종류, 대여 기간 종류, 할인율(%)을 나타냅니다.

Column nameTypeNullable
PLAN_IDINTEGERFALSE
CAR_TYPEVARCHAR(255)FALSE
DURATION_TYPEVARCHAR(255)FALSE
DISCOUNT_RATEINTEGERFALSE

할인율이 적용되는 대여 기간 종류로는 '7일 이상' (대여 기간이 7일 이상 30일 미만인 경우), '30일 이상' (대여 기간이 30일 이상 90일 미만인 경우), '90일 이상' (대여 기간이 90일 이상인 경우) 이 있습니다. 대여 기간이 7일 미만인 경우 할인정책이 없습니다.

문제

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.


풀이
세 개의 테이블을 조인해야하는데 조건이 많아 WHERE절을 길게 써야하는 게 보기 좋지 않길래 가상 테이블을 만들어서 사용했다
가상 테이블 내에서 최대한 조건에 맞는 행들만 뽑아냈고 마지막에 테이블들을 모두 조인했다

여러 테이블을 JOIN하는 방법과 WHERE 절에서 서브쿼리를 사용해 NOT IN으로 원하는 행들만 추출하는 방법을 복습할 수 있었다
날짜 설정하는 부분이 좀 까다로웠다고 생각하는데 2022년 11월 중에 대여를 시작해 2022년 11월 중에 대여 날짜가 끝나는 경우를 제외했다
그리고 WHERE절을 먼저 보기때문에 SELECT 부분에서 AS를 사용해 지정한 별칭은 WHERE절에서 사용할 수 없다

WITH CC AS (
    SELECT CAR_ID, CAR_TYPE, DAILY_FEE
    FROM CAR_RENTAL_COMPANY_CAR 
    WHERE CAR_TYPE = "SUV" OR CAR_TYPE = "세단"
)
, CH AS (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    WHERE CAR_ID NOT IN (
        SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE END_DATE > "2022-11-01" AND START_DATE < "2022-11-30"
    )
)
, CD AS (
    SELECT CAR_TYPE, 1-DISCOUNT_RATE/100 AS DISCOUNT_RATE
    FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN 
    WHERE DURATION_TYPE = "30일 이상"
)
SELECT CC.CAR_ID, CC.CAR_TYPE, ROUND(CC.DAILY_FEE*CD.DISCOUNT_RATE*30) AS FEE
FROM CC
INNER JOIN CH
ON CC.CAR_ID = CH.CAR_ID
INNER JOIN CD
ON CC.CAR_TYPE = CD.CAR_TYPE
WHERE ROUND(CC.DAILY_FEE*CD.DISCOUNT_RATE*30) BETWEEN 500000 AND 1999999
GROUP BY CC.CAR_ID
ORDER BY FEE DESC, CC.CAR_TYPE, CC.CAR_ID DESC
profile
무럭무럭 성장하는 개린이 공부 공간

0개의 댓글