Coding Test
[SQL]특정 기간동안 대여 가능한 자동차들의 대여비용 구하기(MySQL)
da-da-da
2023. 3. 15. 11:46
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_CAR : 대여중인 자동차 정보
- 연결
- CAR_RENTAL_COMPANY_CAR의 CAR_ID - CAR_RENTAL_COMPANY_RENTAL_HISTORY의 CAR_ID
- CAR_RENTAL_COMPANY_CAR의 CAR_TYPE - CAR_RENTAL_COMPANY_DISCOUNT_PLAN의 CAR_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
반응형