노아
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 본문
Question
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
Pseudocode
- 서브쿼리 a 생성:
- car_rental_company_rental_history 테이블에서 모든 컬럼을 선택합니다.
- DATEDIFF 함수를 사용하여 대여 기간을 계산합니다.
- 대여 기간에 따라 duration_type을 결정:
- 7일 미만: NULL
- 7일 이상 30일 미만: '7일 이상'
- 30일 이상 90일 미만: '30일 이상'
- 90일 이상: '90일 이상'
- 메인 쿼리:
- 서브쿼리 a와 car_rental_company_car 테이블을 car_id를 기준으로 JOIN합니다.
- car_rental_company_discount_plan 테이블과는 LEFT JOIN하여 해당 차량 유형과 대여 기간 유형에 맞는 할인 계획을 연결합니다.
- 요금 계산:
- history_id와 계산된 요금을 선택:
- 요금 = daily_fee * (대여일 수 + 1) * (100 - 할인율) / 100
- 요금을 반올림하여 정수로 만듭니다.
- history_id와 계산된 요금을 선택:
- 조건:
- 차량 유형이 '트럭'인 경우만 선택합니다.
- 정렬:
- 요금을 기준으로 내림차순 정렬하고, 같은 요금일 경우 history_id를 기준으로 내림차순 정렬합니다.
Code
SELECT history_id,
round(daily_fee * (datediff(end_date, start_date) + 1) * (100 - ifnull(discount_rate, 0)) /
100, 0) fee
FROM (SELECT *,
CASE
WHEN datediff(end_date, start_date) + 1 < 7 THEN NULL
WHEN datediff(end_date, start_date) + 1 < 30 THEN '7일 이상'
WHEN datediff(end_date, start_date) + 1 < 90 THEN '30일 이상'
ELSE '90일 이상'
END duration_type
FROM car_rental_company_rental_history) a
JOIN car_rental_company_car b
ON a.car_id = b.car_id
LEFT JOIN car_rental_company_discount_plan c
ON c.car_type = b.car_type AND a.duration_type = c.duration_type
WHERE b.car_type = '트럭'
ORDER BY 2 DESC, 1 DESC
'알고리즘 > SQL' 카테고리의 다른 글
[프로그래머스] FrontEnd 개발자 찾기 (0) | 2024.09.20 |
---|---|
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (1) | 2024.09.20 |
[프로그래머스] 대장균의 크기에 따라 분류하기 2 (0) | 2024.09.20 |
[프로그래머스] 연도별 대장균 크기의 편차 구하기 (0) | 2024.09.20 |
[프로그래머스] 조건에 맞는 개발자 찾기 (0) | 2024.09.20 |