https://school.programmers.co.kr/learn/courses/30/lessons/151141
[문제]
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
[나의 풀이]
WITH A AS (
SELECT H.HISTORY_ID, H.CAR_ID, C.DAILY_FEE, C.CAR_TYPE,
DATEDIFF(END_DATE, START_DATE)+1 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 DURATION_TYPE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY H
LEFT JOIN CAR_RENTAL_COMPANY_CAR C
ON H.CAR_ID = C.CAR_ID
WHERE C.CAR_TYPE = '트럭'
)
SELECT
A.HISTORY_ID,
ROUND(A.DAILY_FEE * A.PERIOD * (1-IFNULL(P.DISCOUNT_RATE,0)/100),0) AS FEE
FROM A
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON A.CAR_TYPE = P.CAR_TYPE AND A.DURATION_TYPE = P.DURATION_TYPE
ORDER BY 2 DESC, 1 DESC;
[다른 풀이]
SELECT C.HISTORY_ID,
ROUND(C.PERIOD * (C.DAILY_FEE * (100 - COALESCE(D.DISCOUNT_RATE, 0))) / 100, 0) AS FEE
FROM (
SELECT A.HISTORY_ID,
B.CAR_TYPE,
B.DAILY_FEE,
DATEDIFF(A.END_DATE, A.START_DATE) + 1 AS PERIOD,
CASE
WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 90 THEN "90일 이상"
WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 30 THEN "30일 이상"
WHEN DATEDIFF(A.END_DATE, A.START_DATE) + 1 >= 7 THEN "7일 이상"
ELSE NULL
END AS DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS A
LEFT JOIN CAR_RENTAL_COMPANY_CAR AS B
ON A.CAR_ID = B.CAR_ID
WHERE B.CAR_TYPE = '트럭'
) AS C
LEFT JOIN (
SELECT DURATION_TYPE, DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE CAR_TYPE = '트럭'
) AS D
ON C.DURATION = D.DURATION_TYPE
ORDER BY FEE DESC, HISTORY_ID DESC;
'프로그래머스 > My SQL' 카테고리의 다른 글
연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (1) | 2024.12.28 |
---|---|
특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2024.12.27 |
저자 별 카테고리 별 매출액 집계하기 (0) | 2024.12.25 |
주문량이 많은 아이스크림들 조회하기 (0) | 2024.12.24 |
취소되지 않은 진료 예약 조회하기 (0) | 2024.12.23 |