관리 메뉴

오늘도 배운다

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

코딩테스트연습(SQL)

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

LearnerToRunner 2023. 3. 28. 23:10

문제

source: 프로그래머
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를 기준으로 내림차순 정렬해주세요.

 

 

 

 

 

제출답안(MySQL)

SET @rent_for := DATEDIFF('2022-11-30', '2022-11-01') + 1;
SET @dur_type := (SELECT 
                        CASE
                            WHEN @rent_for >= 90 THEN '90일 이상'
                            WHEN @rent_for >= 30 THEN '30일 이상'
                            WHEN @rent_for >= 7 THEN '7일 이상' 
                            ELSE NULL END COLLATE utf8mb4_0900_ai_ci);
                            
WITH 
    car_sd_suv AS
                (SELECT *
                 FROM car_rental_company_car
                 WHERE car_type IN ('세단', 'SUV')),

    rent_nov AS
               (SELECT DISTINCT(car_id)
               FROM car_rental_company_rental_history
               WHERE 
                    start_date <= '2022-11-30'
                    AND end_date >= '2022-11-01'),

    dc_sd_suv AS
                (SELECT *
                 FROM car_rental_company_discount_plan
                WHERE duration_type = @dur_type COLLATE utf8mb4_0900_ai_ci)

SELECT
    ls_car_nov.car_id,
    ls_car_nov.car_type,
    ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) AS fee

FROM
    (SELECT *
    FROM car_sd_suv
    WHERE car_id NOT IN (SELECT car_id FROM rent_nov)) AS ls_car_nov
    JOIN dc_sd_suv AS dc ON ls_car_nov.car_type = dc.car_type

WHERE
     ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) >= 500000
    AND  ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) <= 2000000

ORDER BY fee DESC, car_type, car_id DESC

 

 

 

풀이(MySQL)

더보기

렌트기간과 duration_type을 위한 지역변수 선언

SET @rent_for := DATEDIFF('2022-11-30', '2022-11-01') + 1;
SET @dur_type := (SELECT 
                        CASE
                            WHEN @rent_for >= 90 THEN '90일 이상'
                            WHEN @rent_for >= 30 THEN '30일 이상'
                            WHEN @rent_for >= 7 THEN '7일 이상' 
                            ELSE NULL END COLLATE utf8mb4_0900_ai_ci);

 

CTE1: 세단과 SUV만 포함하는 차 목록

WITH 
    car_sd_suv AS
                (SELECT *
                 FROM car_rental_company_car
                 WHERE car_type IN ('세단', 'SUV')),

 

CTE2: 11월에 대여된 적이 있는 차 목록


    rent_nov AS
               (SELECT DISTINCT(car_id)
               FROM car_rental_company_rental_history
               WHERE 
                    start_date <= '2022-11-30'
                    AND end_date >= '2022-11-01'),

>> 11월에 대여되었음을 판단하는 기준

>> a. 렌트 시작 날짜가 11월 30일 이하이면서 

>> b. 렌트 종료 날짜가 11월 1일 이상

 

 

CTE 3: 트럭의 discount plan

    dc_sd_suv AS
                (SELECT *
                 FROM car_rental_company_discount_plan
                WHERE duration_type = @dur_type COLLATE utf8mb4_0900_ai_ci)

 

 

문제 요청대로 쿼리

SELECT
    ls_car_nov.car_id,
    ls_car_nov.car_type,
    ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) AS fee

FROM
    (SELECT *
    FROM car_sd_suv
    WHERE car_id NOT IN (SELECT car_id FROM rent_nov)) AS ls_car_nov
    JOIN dc_sd_suv AS dc ON ls_car_nov.car_type = dc.car_type

WHERE
     ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) >= 500000
    AND  ROUND(daily_fee * @rent_for * (1 - discount_rate * 0.01)) <= 2000000

ORDER BY fee DESC, car_type, car_id DESC

 

 

 

 

 

문제 바로가기(MySQL)

728x90
Comments