알고리즘/SQL

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

happenundo 2024. 7. 16. 14:09
728x90
 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


서브 쿼리와 NOT IN을 활용해서 푸는 문제.

까다로웠던 점은 2022-11-01 ~ 2011-11-30까지 대여 가능한 자동차를 구분해내는 작업이었다.

 

SELECT CAR_ID
    FROM SELECTED_CAR JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY USING(CAR_ID)
    WHERE (START_DATE < '2022-11-01' AND END_DATE >= '2022-11-01') OR
            (START_DATE >= '2022-11-01')
    GROUP BY CAR_ID

 

이 쿼리를 통해 대여 시작 날짜가 2022-11-01보다 작고 대여 마무리 날짜가 2022-11-01이상인 경우 / 그리고 대여 시작날짜가 2022-11-01이상인 경우의 CAR_ID만 뽑아내면 이 테이블에는 2022-11-01 ~ 2022-11-30까지 대여 불가능한 자동차의 CAR_ID만 남는다.

 

이 테이블을 NOT IN 문을 사용해 2022-11-01 ~ 2022-11-30까지 대여가 가능한 자동차를 뽑아낼 수 있다.

 

 

풀이 코드

-- 코드를 입력하세요
WITH SELECTED_CAR AS (
    SELECT CAR_ID, CAR_TYPE, DAILY_FEE
    FROM CAR_RENTAL_COMPANY_CAR
    WHERE CAR_TYPE IN ('세단', 'SUV')
), DISCOUNT_RATE_SELECTED_CAR AS (
    SELECT CAR_TYPE, DISCOUNT_RATE
    FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
    WHERE DURATION_TYPE = '30일 이상' AND CAR_TYPE IN ('세단', 'SUV')
)


SELECT CAR_ID, CAR_TYPE, ROUND((DAILY_FEE * 30) * (1 - DISCOUNT_RATE / 100)) AS FEE
FROM SELECTED_CAR JOIN DISCOUNT_RATE_SELECTED_CAR USING(CAR_TYPE)
WHERE CAR_ID NOT IN (SELECT CAR_ID
    FROM SELECTED_CAR JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY USING(CAR_ID)
    WHERE (START_DATE < '2022-11-01' AND END_DATE >= '2022-11-01') OR
            (START_DATE >= '2022-11-01')
    GROUP BY CAR_ID) AND ROUND((DAILY_FEE * 30) * (1 - DISCOUNT_RATE / 100)) >= 500000 AND ROUND((DAILY_FEE * 30) * (1 - DISCOUNT_RATE / 100)) < 2000000
ORDER BY FEE DESC, CAR_TYPE, CAR_ID DESC

 

SELECTED_CAR: 차 종류가 세단, SUV인 경우를 조회하는 테이블

DISCOUNT_RATE_SELECTED_CAR: 대여 기간 종류가 30일 이상이고 차 종류가 세단, SUV인 경우의 차 종류, 할인율을 조회하는 테이블

 

 

 

728x90