본문 바로가기
DB/MySQL

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

by 애기 개발자 2023. 9. 19.
반응형

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

 

프로그래머스

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

programmers.co.kr

 

3개의 table을 종합적으로 사용하는 문제였다.

 

우선 정답 코드

 

-- 코드를 입력하세요
SELECT A.CAR_ID, A.CAR_TYPE
, ROUND((DAILY_FEE * 30 * ((100 - C.DISCOUNT_RATE) / 100)), 0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR AS A
# JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY AS B
# ON A.CAR_ID = B.CAR_ID
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS C
ON A.CAR_TYPE = C.CAR_TYPE
WHERE A.CAR_TYPE IN ('세단', 'SUV')
AND A.CAR_ID NOT IN (
    SELECT B2.CAR_ID FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS B2
    WHERE (('2022-11-01' <= END_DATE AND '2022-11-30' >= END_DATE)
    OR ('2022-11-01' <= START_DATE AND '2022-11-30' >= START_DATE))
    OR ('2022-11-01' > START_DATE AND '2022-11-30' < END_DATE)
    )
AND C.DURATION_TYPE = '30일 이상'
GROUP BY A.CAR_ID
HAVING 500000 <= FEE AND FEE < 2000000
ORDER BY 3 DESC, 2 ASC, 1 DESC

조건을 하나씩 뜯어보면서 하면 된다.

 

  1. CAR_TYPE 이 세단, SUV
  2. 2022-11-01~2022-11-30 사이에 대여가 가능한 차량
  3. 대여금액이 50만 원 이상 200만 원 미만

 

우선 1번 조건은 어렵지 않다.

 

2번 조건은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블을 서브쿼리로 만들어서

 

11월이 포함되는 모든 날짜

11월 이전에 시작해서 11월 이후에 시작하는 모든 날짜

 

위 두가지를 포함하지 않는 CAR_ID를 NOT IN 으로 받아서 뽑았다.

 

3번 조건은 어차피 GROUP BY CAR_ID를 할 경우 CAR_ID는 하나씩만 존재하기 때문에

SELECT 절에서 만들어 놓은 FEE 컬럼을 HAVING 을 사용해서 필터를 걸어준다.

반응형

댓글