코딩테스트/SQL 코딩테스트

<프로그래머스> 자동차 대여 기록 별 대여 금액 구하기

배또가또 2024. 1. 10. 21:56

출처 : https://school.programmers.co.kr/learn/courses/30/lessons/151141

 

프로그래머스

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

programmers.co.kr


  • 문제요구사항
    • 세 테이블을 조인하여 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서
    • 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력
    • 결과는 대여 금액을 기준으로 내림차순 정렬
    • 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬

정답코드

1) MySQL

WITH RENT_HISTORY(HISTORY_ID, CAR_ID, TERM) AS
(
    SELECT HISTORY_ID,
           CAR_ID,
           DATEDIFF(END_DATE, START_DATE)+1 AS TERM
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
),
CAR_HISTORY(HISTORY_ID, TERM, CAR_ID, DAILY_FEE) AS
(
    SELECT  H.HISTORY_ID,
            H.TERM,
            H.CAR_ID,
            C.DAILY_FEE
    FROM RENT_HISTORY H LEFT JOIN CAR_RENTAL_COMPANY_CAR C ON H.CAR_ID = C.CAR_ID
    WHERE C.CAR_TYPE = '트럭'
)
SELECT HISTORY_ID,
       ROUND(DAILY_FEE*DISCOUNT_RATE*TERM) FEE
FROM
(
    SELECT HISTORY_ID,
           DAILY_FEE,
           TERM,
           CASE WHEN TERM >= 90 THEN 0.85
                WHEN TERM BETWEEN 30 AND 89 THEN 0.92
                WHEN TERM BETWEEN 7 AND 29 THEN 0.95
                ELSE 1
                END DISCOUNT_RATE
    FROM CAR_HISTORY
) A
ORDER BY 2 DESC, 1 DESC;

2) Oracle

WITH RENT_HISTORY(HISTORY_ID, CAR_ID, TERM) AS 
(
    SELECT HISTORY_ID, 
           CAR_ID, 
           (END_DATE-START_DATE)+1 AS TERM
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY 
),
CAR_HISTORY(HISTORY_ID, TERM, CAR_ID, DAILY_FEE) AS 
(
    SELECT  H.HISTORY_ID, 
            H.TERM, 
            H.CAR_ID,
            C.DAILY_FEE
    FROM RENT_HISTORY H LEFT JOIN CAR_RENTAL_COMPANY_CAR C ON H.CAR_ID = C.CAR_ID
    WHERE C.CAR_TYPE = '트럭'
)
SELECT HISTORY_ID, 
       ROUND(DAILY_FEE*DISCOUNT_RATE*TERM) FEE
FROM
(
    SELECT HISTORY_ID, 
           DAILY_FEE, 
           TERM, 
           CASE WHEN TERM >= 90 THEN 0.85
                WHEN TERM BETWEEN 30 AND 89 THEN 0.92
                WHEN TERM BETWEEN 7 AND 29 THEN 0.95
                ELSE 1
                END DISCOUNT_RATE
    FROM CAR_HISTORY
) A
ORDER BY ROUND(DAILY_FEE*DISCOUNT_RATE*TERM) DESC, HISTORY