자동차 대여 기록 별 대여 금액 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/151141
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요.
결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
첫번째 방법
WITH CAR_TABLE AS (
SELECT C.car_id CAR_ID, car_type, daily_fee, history_id
, DATEDIFF(end_date, start_date)+1 AS PERIOD
, CASE WHEN DATEDIFF(end_date, start_date)+1 >= 90 THEN '90일 이상'
WHEN DATEDIFF(end_date, start_date)+1 >= 30 THEN '30일 이상'
WHEN DATEDIFF(end_date, start_date)+1 >= 7 THEN '7일 이상'
END AS DATE
FROM CAR_RENTAL_COMPANY_CAR C JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY H
ON C.car_id = H.car_id
WHERE C.car_type = '트럭'
)
SELECT history_id
, ROUND((DAILY_FEE * (100 - IFNULL(DISCOUNT_RATE, 0)) /100) * PERIOD) AS FEE
FROM CAR_TABLE C LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON C.car_type = p.car_type AND C.DATE = P.DURATION_TYPE
ORDER BY FEE DESC, history_id DESC
- CAR_RENTAL_COMPANY_CAR 테이블과CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블을 합쳐서 가져오려는 컬럼만 빼고 새로운 CAR_TABLE 생성
- CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블과 LEFT JOIN
- CAR_TABLE의 DATE컬럼이 NULL값이 존재하므로(아래 사진) IFNULL을 사용해서 할인율이 없으면 0으로 치환
- 대여 금액은 daily_fee * 할인율 * 기간
두번째 방법 - 다른 분 참고
SELECT HISTORY_ID
, ROUND(CASE WHEN rental_date < 7 THEN rental_date * daily_fee
WHEN rental_date < 30 THEN rental_date * daily_fee * 0.95
WHEN rental_date < 90 THEN rental_date * daily_fee * 0.92
ELSE rental_date * daily_fee * 0.85 END,0) AS FEE
FROM (
SELECT history_id, car_id, (DATEDIFF(end_date, start_date)+1) rental_date
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE car_id in (SELECT car_id
FROM CAR_RENTAL_COMPANY_CAR
WHERE car_type = '트럭')
) HIS
LEFT JOIN CAR_RENTAL_COMPANY_CAR USING (CAR_ID)
ORDER BY 2 DESC, 1 DESC
DATEDIFF 문법
2022.11.24 - [🛠️Skill/SQL] - [SQL문법] DATEDIFF, TIMESTAMPDIFF (날짜 차이)-MySQL
[SQL문법] DATEDIFF, TIMESTAMPDIFF (날짜 차이)-MySQL
날짜간의 차이를 가져오는 함수 : DATEDIFF, TIMESTAMPDIFF DATEDIFF DATEDIFF(날짜1, 날짜2) # = 날짜1 - 날짜2 TIMESTAMPDIFF TIMESTAMPDIFF(단위, 날짜1, 날짜2) # 날짜2 - 날짜1 단위 SECOND : 초 MINUTE : 분 HOUR : 시 DAY : 일 W
dataanalysisdot.tistory.com
'🛠️Skill > CodingTest' 카테고리의 다른 글
[프로그래머스] Lv4. 저자 별 카테고리 별 매출액 집계하기 (0) | 2022.12.18 |
---|---|
[프로그래머스] Lv2.조건에 맞는 도서와 저자 리스트 출력/Lv3. 카테고리 별 도서 판매량 집계 (0) | 2022.12.16 |
[leetcode] 1667. Fix Names in a Table / CONCAT, SUBSTRING (0) | 2022.12.12 |
[프로그래머스]Lv5. 상품을 구매한 회원 비율 구하기 (0) | 2022.12.06 |
[프로그래머스] Lv3. 오랜 기간 보호한 동물(1) (2) / LEFT JOIN (0) | 2022.12.05 |
댓글