문제: 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를 기준으로 내림차순 정렬해주세요.
-- CAR_RENTAL_COMPANY_CAR: 현재 대여 중
-- CAR_RENTAL_COMPANY_RENTAL_HISTORY: 대여 기록 정보
-- CAR_RENTAL_COMPANY_DISCOUNT_PLAN: 할인 정보
-- WHERE로 세단 또는 SUV, 2022년 11월 1일부터 11월 30일
-- 30일 할인율 적용한 50만원 ~ 200만원 미만
-- WITH 구문으로 필요한 INNER JOIN 테이블 만들기
-- 테이블에서 할인률 적용한 대여 금액 구하기
WITH CAR_JOIN_T AS (
SELECT C.CAR_ID, C.CAR_TYPE, C.DAILY_FEE, H.START_DATE, H.END_DATE, P.DURATION_TYPE, P.DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_CAR AS C
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS H
ON C.CAR_ID = H.CAR_ID
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS P
ON C.CAR_TYPE = P.CAR_TYPE)
SELECT
DISTINCT CAR_ID,
CAR_TYPE,
ROUND(DAILY_FEE * (1 - DISCOUNT_RATE / 100) * 30) AS FEE
FROM CAR_JOIN_T
WHERE CAR_TYPE IN ('세단', 'SUV')
AND DURATION_TYPE = '30일 이상'
AND 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')
AND DAILY_FEE * (1 - DISCOUNT_RATE / 100) * 30 >= 500000
AND DAILY_FEE * (1 - DISCOUNT_RATE / 100) * 30 < 2000000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC
많은 조건으로 필터링해야 하는 문제다. 이 문제의 경우 아래와 같이 코드를 작성했을 때 문제가 발생했다.
AND CAR_ID NOT IN (START_DATE <= '2022-11-30' AND END_DATE >= '2022-11-01')
오류: CAR_ID 목록이 아닌 TRUE/FALSE의 논리 연산 결과가 반환되서 정확한 CAR_ID를 필터링할 수 없다.
SQL에서 TRUE면 1, FALSE면 0이 반환되기 때문에 코드 결과는 CAR_ID가 1이거나 0이 아닌 결과가 반환되어 사실상 모든 CAR_ID를 선택한다. 따라서 CAR_ID 목록 괄호 안에 전달하기 위해 SUB QUERY를 사용해서 일차적으로 CAR_ID를 뽑아야 한다.
'Coding Test' 카테고리의 다른 글
| [python] 잘라서 배열로 저장하기 (0) | 2025.09.18 |
|---|---|
| [SQL] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2025.09.18 |
| [SQL] 입양 시각 구하기(2) (0) | 2025.09.17 |
| [SQL] 그룹별 조건에 맞는 식당 출력하기 (0) | 2025.09.15 |
| [SQL] 헤비 유저가 소유한 장소 (1) | 2025.09.01 |