코딩테스트/SQL 코드카타

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

ANNASENA 2024. 9. 16. 08:00
728x90

 

문제

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

 

프로그래머스

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

programmers.co.kr

  • 자동차 종류가 '세단' 또는 '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

 

 

풀이과정

# '2022-11-01' 부터 '2022-11-30'  까지 대여불가능한 자동차만 필터링

  • 대여 시작일(START_DATE)이 '2022-11-01' 이전
    • 2022년 11월 01일 이전에 대여한 기록이 있는 모든 행들
  • 대여 반납일(END_DATE)이 '2022-11-01' 이후
    • 2022년 11월 01일 이후에 반납한 기록이 있는 모든 행들
  • 즉, 자동차 중 2022년 11월 01일 이전에 대여를 해갔는데, 11월 01일 이후에나 반납이 되는 자동차는 
    2022년 11월 01일부터 11월 30일까지 빌리려는 고객에게 대여가 불가능함
1
2
3
4
5
6
7
8
SELECT *
FROM 
    CAR_RENTAL_COMPANY_CAR CC
LEFT JOIN 
    CAR_RENTAL_COMPANY_RENTAL_HISTORY RH 
    ON CC.CAR_ID = RH.CAR_ID 
    AND RH.START_DATE < '2022-11-01' 
    AND RH.END_DATE >= '2022-11-01'
cs

LEFT JOIN을 해서 대여 기록이 없는 자동차는 NULL임

 

# 문제 조건에 맞게 '2022-11-01'부터 '2022-11-30'까지 대여 가능한 자동차만 필터링 하기

  • 자동차 정보 테이블 + 자동차 대여 기록 테이블 + 자동차 대여기간 별 할인율 테이블 모두 조인
    • 문제 조건에 따라 '30일 이상' 대여할 경우의 할인율을 자동차 종류('세단', 'SUV')에 따라 적용 후 FEE 계산
  • WHERE 조건에서 대여 기록이 없는 자동차 (즉, 11월 01부터 11월 30일까지 대여 가능한 자동차) 필터링하기
    • 자동차 종류는 '세단' 또는 'SUV'일 것
    •  FEE는 50만원에서 200만원 사이일 것
  • 마지막으로 정렬기준까지 주면 끝!

# 정답

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT CC.CAR_ID, 
       CC.CAR_TYPE, 
       ROUND(CC.DAILY_FEE * (1 - DP.DISCOUNT_RATE*0.01* 300) AS FEE
FROM CAR_RENTAL_COMPANY_CAR CC
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY RH 
          ON CC.CAR_ID = RH.CAR_ID 
          AND RH.START_DATE < '2022-11-01' 
          AND RH.END_DATE >= '2022-11-01'
JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN DP 
     ON CC.CAR_TYPE = DP.CAR_TYPE 
     AND DP.DURATION_TYPE LIKE '30%'
WHERE CC.CAR_TYPE IN ('세단''SUV')
      AND RH.HISTORY_ID IS NULL  -- 2022년 11월 1일부터 11월 30일 사이에 대여 이력이 없는 자동차만 선택
HAVING FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, CC.CAR_TYPE ASC, CC.CAR_ID DESC;
cs

728x90