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

    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

    댓글