본문 바로가기

Coding Test

[SQL]특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(MySQL)

728x90
반응형

문제

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

 

 

풀이과정

  • 테이블 정보
    • CAR_RENTAL_COMPANY_CAR : 대여중인 자동차 정보
      • OPTIONS : '주차감지센서', '스마트키', '네비게이션', '통풍시트', '열선시트', '후방카메라', '가죽시트' -> ',' 로 구분된 리스트
    • CAR_RENTAL_COMPANY_RENTAL_HISTORY : 대여 기록 정보
    • CAR_RENTAL_COMPANY_DISCOUNT_PLAN : 자동차 종류별 할인 정책
  • 연결
    • CAR_RENTAL_COMPANY_CARCAR_ID - CAR_RENTAL_COMPANY_RENTAL_HISTORYCAR_ID
    • CAR_RENTAL_COMPANY_CARCAR_TYPE - CAR_RENTAL_COMPANY_DISCOUNT_PLANCAR_TYPE
  • 조건
    • CAR_TYPE : 세단, SUB
    • START_DATE ~ END_DATE : 2022-11-01 ~ 2022-11-30 대여가능 -> 해당 기간 CAR_RENTAL_COMPANY_RENTAL_HISTORY에 없는 CAR_ID 추출
    • 30일간 대여 금액이 50만원 이상 ~ 200만원 미만 -> 차종별 DAILY_FEE * 30일 * (100 - 30일 이상 DISCOUNT_RATE )*0.01
    • FEE의 경우 정수만 출력
  • 정렬
    • 대여금액 내림차순
    • 자동차 종류를 기준으로 오름차순
    • 자동차 ID 기준 내림차순

 

Script

SELECT
    ORG.CAR_ID,
    ORG.CAR_TYPE,
    ORG.FEE

FROM
(
SELECT
    A.CAR_ID,
    A.CAR_TYPE,
    A.DAILY_FEE,
    ROUND(A.DAILY_FEE * (100 - C.DISCOUNT_RATE)/100 * 30) AS FEE,
    B.START_DATE,
    B.END_DATE,
    C.DURATION_TYPE,
    C.DISCOUNT_RATE
FROM 
    CAR_RENTAL_COMPANY_CAR A
    LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
        ON A.CAR_ID = B.CAR_ID
    JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN C
        ON A.CAR_TYPE = C.CAR_TYPE
WHERE 
    C.CAR_TYPE in ('세단', 'SUV')
    AND C.DURATION_TYPE in (30)
GROUP BY A.CAR_ID, C.DISCOUNT_RATE, C.DURATION_TYPE
) ORG

WHERE 1=1
    AND (ORG.END_DATE < '2022-11-01' OR ORG.START_DATE >'2022-11-30') # 대여기간이 11-01이전에 끝나거나 11-30이후에 시작되는 차량
    AND ORG.FEE >= 500000 AND ORG.FEE < 2000000
ORDER BY 
    ORG.FEE DESC, ORG.CAR_TYPE ASC, ORG.CAR_ID DESC

* 마지막 WHERE 절에서 FEE 조건이 듣지 않아 여기저기 다 뜯어봐도 이유를 알 수 없었다. 
이유를 알고보니 AND (ORG.END_DATE < '2022-11-01' OR ORG.START_DATE >'2022-11-30') 이 아닌
AND ORG.END_DATE < '2022-11-01' OR ORG.START_DATE >'2022-11-30' 처럼 괄호를 누락하면서 다음 조건이 듣지 않았던 것이었다. 

* 마지막 조건을 걸기 위한 테이블을 취합하자

 

 

728x90
반응형