본문 바로가기
SQL/SQL test

[Programmers] 특정 기간동안 대여 가능한 자동차 대여 비용(풀이)

by ISLA! 2024. 4. 9.

문제 

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

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr


풀이

📍 조건

- 자동차 종류가 '세단' 또는 'SUV'인 자동차 중
- 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고
- 30일간의 대여 금액이 50만 원 이상 200만 원 미만인 자동차에 대해서 
- 자동차 ID, 자동차 종류, 대여 금액(칼럼명: FEE) 리스트 출력
- 대여 금액 내림차순, 자동차 종류 오름차순 정렬, 자동차 ID를 기준으로 내림차순

 

📍 1차 조인

  • car 테이블과 plan 테이블을 먼저 조인한다.
    이때 30일간 대여가능한 자동차만 봐야하기 때문에 duration_type 조건도 JOIN ON에 걸어준다.

 

📍 WHERE 절

  • (1) car_type 을 2종으로 제한하는 조건을 걸고,
  • (2) 2022년 12월 1일부터 2022년 11월 30일까지 대여 가능한 리스트를 출력하기 위해 history 테이블을 서브쿼리로 사용한다.
    → 11월 한달 동안(30일) 대여 가능하려면 대여 날짜가 2022년 12월 01일보다 전이면서 반납 날짜가 2022년 11월 1일 이후인 경우를 피하면 된다 (또는 아래와 같이 조건을 걸 수 있음)
END_DATE > '2022-11-01' AND START_DATE < '2022-12-01'

 

 

📍 SELECT 절

  • SELECT 절에 car_id, car_type, FEE를 계산해서 넣어준다.
  • HAVING 절에 FEE의 조건을 지정한다 (30일간의 대여 금액이 50만 원 이상 200만 원 미만)
    → SELECT 절에서 생성한 컬럼이므로, WHERE가 아닌 HAVING에 넣어줘야 함!
HAVING  FEE >= 500000 AND FEE < 2000000

 

  • 문제에 제시된 대로 ORDER BY 절을 기입하고 마무리
SELECT  CAR.CAR_ID,
        CAR.CAR_TYPE,
        ROUND(CAR.DAILY_FEE * 30 * (100 - PLAN.DISCOUNT_RATE)/100) AS FEE
        -- 먼저 두 개 테이블 조인
  FROM  CAR_RENTAL_COMPANY_CAR AS CAR
  JOIN  CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS PLAN
    ON  CAR.CAR_TYPE = PLAN.CAR_TYPE 
        AND PLAN.DURATION_TYPE = '30일 이상'
        -- 차종류 조건 / 대여가능한 기간 조건(서브쿼리)
 WHERE  1=1 
        AND CAR.CAR_TYPE IN ('세단', 'SUV')
        AND CAR.CAR_ID NOT IN (
        SELECT CAR_ID
        FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
        WHERE START_DATE < '2022-12-01' AND END_DATE >= '2022-11-01'
        )
        -- 대여금액 조건
HAVING  FEE >= 500000 AND FEE < 2000000
 ORDER 
    BY  FEE DESC
        , CAR.CAR_TYPE ASC
        , CAR.CAR_ID DESC;

 

728x90