문제출처 : https://school.programmers.co.kr/learn/courses/30/lessons/157339
Lv4 에 해당하는 JOIN 문제이기 때문에 기존 문제와 달리 조금 생각에 오래걸렸던거 같다.
우선 해당 문제를 풀기 위해 작성한 답안은 다음과 같다.
SELECT
CAR.CAR_ID,
CAR.CAR_TYPE,
ROUND(CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100) AS FEE
FROM
CAR_RENTAL_COMPANY_CAR AS CAR
JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
ON CAR.CAR_TYPE = PLAN.CAR_TYPE AND PLAN.DURATION_TYPE = '30일 이상'
WHERE
CAR.CAR_TYPE IN ('세단','SUV')
AND CAR.CAR_ID NOT IN
(
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-11-30' AND END_DATE >= '2022-11-01'
)
HAVING
FEE >= 500000 and FEE <= 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_TYPE DESC;
문제에서 주어진 조건은 다음과 같다.
자동차 종류가 세단,SUV 인 자동차 이면서
2022-11-01 ~ 2022-11-30 까지 대여가 가능하고
총 대여금액이 50만원 ~ 200만원 사이의 자동차 목록을 구해라
나는 문제를 해결하기 위해 한단계 한단계 작은부분, 쉬운부분 부터 해결해나가고자 하는편이다.
그래서 일단 나는 차량별 대여금액을 구하기 위해 다음 쿼리처럼 부분적으로 쿼리를 작성했다.
SELECT
FROM
CAR_RENTAL_COMPANY_CAR AS CAR
JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
ON CAR.CAR_TYPE = PLAN.CAR_TYPE AND PLAN.DURATION_TYPE = '30일 이상'
차량별 할인이 적용된 금액을 구하기 위해 두 테이블을 Join 하였고, 그리고 문제에서 1일 ~ 30일 기간동안 할인이 적용된 렌트비용을 구하기 위해 필요한DURATION_TYPE 이 30일 이상 값을 가진 컬럼만 가져오도록 하였다.
이 후 문제에서 주어진 조건을 만족시키기 위해 WHERE 절을 적용했다.
그리고 문제에서 주어진 조건 3가지는 다음과 같다.
1) 차량의 종류가 SUV,세단
2) 대여기간이 2022-11-01 ~ 2022-11-30 일이 가능한 차량종류
3) 총 대여금액이 50만원 이상 200만원 이하인 차량
이제 위 조건을 만족시키는 행을 필터링 하기위해 다음과 같이 쿼리를 작성했다.
SELECT
CAR.CAR_ID,
CAR.CAR_TYPE,
ROUND(CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100) AS FEE
FROM
CAR_RENTAL_COMPANY_CAR AS CAR
JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
ON CAR.CAR_TYPE = PLAN.CAR_TYPE AND PLAN.DURATION_TYPE = '30일 이상'
WHERE
CAR.CAR_TYPE IN ('세단','SUV') -- 1번 조건
AND CAR.CAR_ID NOT IN
(
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-11-30' AND END_DATE >= '2022-11-01'
) -- 2번 조건
HAVING
FEE >= 500000 and FEE <= 2000000 -- 3번 조건
차량 타입의 구분은 단순하게 IN ( ) 함수를 통해 1번 조건에 대한 필터링을 진행하였고.
2번 조건은 서브쿼리를 이용하여 대여 시작날짜가 2022-11-30 일보다 같거나 작은날짜에 있으면서 대여 종료 날짜가 2022-11-01 일보다 같거나 큰 날짜에 차량을 빌린 CAR_ID 를 조회하여 해당 CAR_ID 가 아닌 CAR_ID 를 뽑았다.
이는 2022년 11월 01일 ~ 2022년 11월 30일 기간동안 차량을 빌렸다 반납을 해야하므로 시작날짜가 반납날짜인 2022-11-30 일보다 작거나 같으면서 종료날짜가 2022-11-01 일보다 같거나 크면 위 조건을 만족시킬 수 없으므로 해당 기간에 렌트 기록이 있는 차량은 제외하기 위해 위와 같이 작성하였다.
마지막으로 총 대여금액이 50만원 ~ 200만원 범위 내에 있는 차량만 조회하기위해 다음과 같은 조건을 주었고, 총 대여금액을 구하기 위해 다음 공식을 사용하였다.
차량 일별 렌트 금액 * 30일 * (100-할인율)/100