노아
[프로그래머스] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 본문
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
- 서브쿼리 b 생성:
- car_rental_company_rental_history 테이블에서 car_id를 선택합니다.
- 대여 시작일이 2022년 11월 30일 이후이거나 대여 종료일이 2022년 11월 1일 이전인 경우를 제외합니다.
- 조건에 맞는 레코드 수를 카운트하여 temp라는 별칭을 부여합니다.
- GROUP BY car_id를 사용하여 차량별로 그룹화하고, HAVING 절을 사용하여 temp가 0인 차량만 선택합니다.
- 메인 쿼리:
- car_rental_company_car 테이블과 서브쿼리 b를 car_id를 기준으로 JOIN합니다.
- car_rental_company_discount_plan 테이블과는 car_type을 기준으로 JOIN하여 30일 기준의 할인 계획을 연결합니다.
- 요금 계산:
- 요금 = daily_fee * 30 * (100 - 할인율) / 100
- CAST와 REPLACE를 사용하여 문자열로 된 할인율에서 '%'를 제거하고 숫자로 변환합니다.
- 계산된 요금을 반올림하여 정수로 만듭니다.
- 조건:
- 요금이 500,000 이상 2,000,000 이하인 차량만 선택합니다.
- 정렬:
- 요금을 기준으로 내림차순 정렬하고, 같은 요금일 경우 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
'알고리즘 > SQL' 카테고리의 다른 글
[프로그래머스] 상품을 구매한 회원 비율 구하기 (0) | 2024.09.20 |
---|---|
[프로그래머스] FrontEnd 개발자 찾기 (0) | 2024.09.20 |
[프로그래머스] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2024.09.20 |
[프로그래머스] 대장균의 크기에 따라 분류하기 2 (0) | 2024.09.20 |
[프로그래머스] 연도별 대장균 크기의 편차 구하기 (0) | 2024.09.20 |