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를 기준으로 내림차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/157339
SELECT *
FROM(
SELECT CAR_ID, DATEDIFF(END_DATE, START_DATE) AS DAY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-11-01' # 2022년 11월 1일 이전 기간
AND END_DATE >= '2022-11-30' # 2022년 11월 30일 이후 기간
) h
INNER JOIN CAR_RENTAL_COMPANY_CAR c ON c.CAR_ID = h.CAR_ID
SELECT ch.CAR_ID, ch.CAR_TYPE, CAST((ch.DAILY_FEE * (1 - p.DISCOUNT_RATE / 100) * 30) AS SIGNED) AS FEE
FROM(
SELECT c.CAR_ID, c.CAR_TYPE, c.DAILY_FEE
FROM(
SELECT CAR_ID, DATEDIFF(END_DATE, START_DATE) AS DAY
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE <= '2022-11-01' # 2022년 11월 1일 이전 기간
AND END_DATE >= '2022-11-30' # 2022년 11월 30일 이후 기간
) h
INNER JOIN CAR_RENTAL_COMPANY_CAR c ON c.CAR_ID = h.CAR_ID
WHERE CAR_TYPE = '세단' OR CAR_TYPE ='SUV'
) ch
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN p ON p.CAR_TYPE = ch.CAR_TYPE
WHERE p.DURATION_TYPE LIKE '30일%'
AND (ch.DAILY_FEE * (1 - p.DISCOUNT_RATE / 100) * 30) >= 500000
AND (ch.DAILY_FEE * (1 - p.DISCOUNT_RATE / 100) * 30) < 2000000
ORDER BY FEE DESC, ch.CAR_TYPE, ch.CAR_ID DESC
(1 - p.DISCOUNT_RATE / 100)을 이용해서 만족하는 할인율만 적용할 수 있게 수정했다. SELECT c.CAR_ID, c.CAR_TYPE, CAST((c.DAILY_FEE * (1 - p.DISCOUNT_RATE / 100) * 30) AS SIGNED) AS FEE
FROM CAR_RENTAL_COMPANY_CAR c
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
ON p.CAR_TYPE = c.CAR_TYPE
WHERE
(NOT EXISTS (
# 2022년 11월 1일 ~ 11월 30일까지 대여 가능 ID
SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
WHERE c.CAR_ID = h.CAR_ID
AND h.END_DATE >= '2022-11-01'
AND h.START_DATE <= '2022-11-30'
))
AND (c.CAR_TYPE = '세단' OR c.CAR_TYPE ='SUV')
AND p.DURATION_TYPE LIKE '30일%'
AND (c.DAILY_FEE * (1 - p.DISCOUNT_RATE / 100) * 30) >= 500000
AND (c.DAILY_FEE * (1 - p.DISCOUNT_RATE / 100) * 30) < 2000000
ORDER BY FEE DESC, c.CAR_TYPE, c.CAR_ID DESC
날짜가 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능이라는 것을 잘못 해석한 것이었다. 즉, 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능은 해당 날짜에 대여 기록이 없어야 대여를 할 수 있던 것이다. 나는 그때 대여 기록이 있어야 그동안 대여할 수 있고 그 기록에 자동차의 대여비용을 구하는 것으로 해석한 것이었다.
그래서 해당 날짜가 아닌 애들로만 ID를 추출하는 쿼리를 구성했는데 기존에 있는 것과 합치는 과정은 지피티씨를 이용하였다. ㅜㅜ 어려워~~
최종적으로 문제를 제대로 해석하는 것과 쿼리를 다듬는 것이 부족해서 못 푼 것이었다.
7.28일에 드디어 해결... 다음에 다시 진행해보는 것 추천!!