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

2024. 1. 12. 14:30Coding/프로그래머스-SQL

문제 링크

https://school.programmers.co.kr/learn/courses/30/lessons/157339

 

프로그래머스

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

programmers.co.kr

 

문제

 

코드

-- 코드를 입력하세요
SELECT CAR.CAR_ID, 
       CAR.CAR_TYPE, 
       ROUND(CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE) / 100) AS FEE 
FROM CAR_RENTAL_COMPANY_CAR CAR 
JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY HISTORY 
ON CAR.CAR_ID = HISTORY.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN PLAN
ON CAR.CAR_TYPE = PLAN.CAR_TYPE
WHERE CAR.CAR_ID NOT IN (
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE END_DATE > '2022-11-01' AND START_DATE < '2022-12-01') AND PLAN.DURATION_TYPE = '30일 이상'
GROUP BY CAR.CAR_ID
HAVING CAR.CAR_TYPE IN ('세단', 'SUV') AND (FEE >= 500000 AND FEE < 2000000)
ORDER BY FEE DESC, CAR.CAR_TYPE, CAR.CAR_ID DESC;

이것도 쿼리가 길어지니까 아무래도 내가 놓쳤던 부분을 인터넷의 도움을 많이 받았던 것 같다. 분석했을 때 다음과 같다. 

1. ROUND() 함수 안에 수식을 넣어서 대여 금액 리스트를 생성한다. 수식을 구성하는 것이 연습이 좀 필요한 부분 같다. 

2. 삼중 조인을 해준다. 테이블이 세 개 주어졌고, null값(데이터가 없음)이 출력되는 일이 없어야 하기 때문에 다 INNER JOIN으로 조인을 해준다. 

3. WHERE 조건 절에 서브쿼리를 하나 생성해준다. 서브쿼리에는 문제에서 제시한 2022년 11월에 해당하지 않는 자동차만 출력이 되도록 쿼리를 작성해준다. (서브쿼리의 WHERE 조건절에 날짜를 한정지어준다.)

4. NOT IN을 넣어주어 2022년 11월에 해당하지 않는 자동차의 목록을 부정시켜줌으로써 2022년 11월에 해당하는 자동차의 목록을 출력하도록 해준다.