[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

2024. 5. 5. 19:51코딩 테스트

문제

 

 

 

개념 
  • NOT 컬럼 IN ('A', 'B')
    • 컬럼에서 A와 B를 제외한 값을 출력
    • 단, 컬럼값 중에서 NULL이 존재할 경우 NULL값인 행도 제외됨.(ISNULL로 치환하여 조회 고려)
  • NOT 컬럼 IN (SELECT 컬럼 FROM 테이블 WHERE 조건)
    • 서브 쿼리 조건에 해당하지 않은 컬럼값을 출력

 

 

오답
WITH CAR_RENTAL AS 
(
    SELECT *
    FROM CAR_RENTAL_COMPANY_CAR 
    JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    USING(CAR_ID)
    WHERE CAR_TYPE IN ('세단','SUV') -- 자동차 종류가 세단 또는 SUV
    AND START_DATE >= '2022-11-30' -- 시작 날짜가 2022년 11월 30일 이후
    OR END_DATA <= '2022-11-01' -- 종료 날짜가 2022년 11월 01일 이전
)

/*
만약 위와 같은 조건을 사용한다면 
날짜 조건을 만족하는 값과 만족하지 않는 값, 
둘 다를 가진 CAR_ID가 존재하여 문제 조건을 만족 못할 수 있다.
*/

 

 

정답
WITH CAR_RENTAL AS 
(
    SELECT *
    FROM CAR_RENTAL_COMPANY_CAR 
    JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY 
    USING(CAR_ID)
    WHERE CAR_TYPE IN ('세단','SUV')
    AND CAR_ID NOT IN 
    (
        SELECT CAR_ID 
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE '2022-11-01' BETWEEN START_DATE AND END_DATE 
        OR '2022-11-30' BETWEEN START_DATE AND END_DATE
    )
)

SELECT 
    DISTINCT CAR_ID,
    CAR_TYPE,
    FLOOR(DAILY_FEE * (100 - DISCOUNT_RATE) / 100) * 30 AS FEE
FROM CAR_RENTAL JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN USING(CAR_TYPE)
WHERE DURATION_TYPE = '30일 이상'
AND FLOOR(DAILY_FEE * (100 - DISCOUNT_RATE) / 100) * 30 >= 500000 
AND FLOOR(DAILY_FEE * (100 - DISCOUNT_RATE) / 100) * 30 < 2000000
ORDER BY 3 DESC, 2, 1 DESC