노아

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

알고리즘/SQL

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

Noaahhh 2024. 9. 20. 23:06

 

Question

 

CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.

 

 

Pseudocode

 

 

  1. 서브쿼리 b 생성:
    • car_rental_company_rental_history 테이블에서 car_id를 선택합니다.
    • 대여 시작일이 2022년 11월 30일 이후이거나 대여 종료일이 2022년 11월 1일 이전인 경우를 제외합니다.
    • 조건에 맞는 레코드 수를 카운트하여 temp라는 별칭을 부여합니다.
    • GROUP BY car_id를 사용하여 차량별로 그룹화하고, HAVING 절을 사용하여 temp가 0인 차량만 선택합니다.
  2. 메인 쿼리:
    • car_rental_company_car 테이블과 서브쿼리 b를 car_id를 기준으로 JOIN합니다.
    • car_rental_company_discount_plan 테이블과는 car_type을 기준으로 JOIN하여 30일 기준의 할인 계획을 연결합니다.
  3. 요금 계산:
    • 요금 = daily_fee * 30 * (100 - 할인율) / 100
    • CAST와 REPLACE를 사용하여 문자열로 된 할인율에서 '%'를 제거하고 숫자로 변환합니다.
    • 계산된 요금을 반올림하여 정수로 만듭니다.
  4. 조건:
    • 요금이 500,000 이상 2,000,000 이하인 차량만 선택합니다.
  5. 정렬:
    • 요금을 기준으로 내림차순 정렬하고, 같은 요금일 경우 car_type, 그 다음 car_id 순으로 내림차순 정렬합니다.

 

 

 

Code

 

SELECT a.car_id,
       a.car_type,
       round((daily_fee * 30 * (100 - CAST(replace(discount_rate, '%', '') AS unsigned))) / 100,
             0) AS fee
FROM car_rental_company_car a
         JOIN (SELECT car_id,
                      COUNT(
                              CASE
                                  WHEN start_date > '2022-11-30' OR end_date < '2022-11-01'
                                      THEN NULL
                                  ELSE 1
                                  END) AS temp
               FROM car_rental_company_rental_history
               GROUP BY car_id
               HAVING temp = 0) b ON a.car_id = b.car_id
         JOIN (SELECT *
               FROM car_rental_company_discount_plan
               WHERE duration_type LIKE '30%') c ON a.car_type = c.car_type
having 500000 <= FEE AND  FEE <= 2000000
ORDER BY 3 DESC, 2, 1 DESC