링크
https://school.programmers.co.kr/learn/courses/30/lessons/151141#qna
문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '트럭'인 자동차의 대여 기록에 대해서 대여 기록 별로 대여 금액(컬럼명: FEE)을 구하여 대여 기록 ID와 대여 금액 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 대여 기록 ID를 기준으로 내림차순 정렬해주세요.
코드
select HISTORY_ID, round(daily_fee * (dd+1) * duration_fee,0) as FEE
from
(SELECT history_id,daily_fee,datediff(end_date, start_date) dd,c.car_type,case
when datediff(end_date,start_date)+1 < 7 then 1
when datediff(end_date,start_date)+1 < 30 then 0.95
when datediff(end_date,start_date)+1 < 90 then 0.92
else 0.85
end duration_fee
from CAR_RENTAL_COMPANY_CAR c
left join CAR_RENTAL_COMPANY_RENTAL_HISTORY h on c.CAR_ID = h.CAR_ID
left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN d on c.CAR_TYPE = d.CAR_TYPE ) as t
where car_type = "트럭"
group by 1
order by FEE desc, history_id desc;
출력화면
해설
이 문제는 case문과 join, sub-query를 잘 활용해서 풀면 된다.
먼저, 세 테이블을 사용해야 하는 것을 알게 되었을텐데 left join으로 세 테이블을 합쳐준다.
그리고, 기록별 대여 금액을 알기 위해선 트럭 차량의 할인 %를 컬럼 생성해야한다.이렇게 만들어진 sub-query를 from절에 위치시켜서 어떤 변수를 사용할 것인지 select 해준다. 이후 car_type이 '트럭'이고 대여 기록별인 gruop by history_id를 해준다. 마지막으로 내림차순을 먼저 정렬하고 같은 가격인 경우 대여 기록 ID로 내림차순을 하고 싶을 땐, order by 변수명A desc, 변수명B desc로 작성해준다.
'Coding Test > SQL' 카테고리의 다른 글
프로그래머스 SQL Lv.3 [대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기] (0) | 2023.02.24 |
---|---|
프로그래머스SQL Lv.3 [자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기] (0) | 2023.02.17 |
프로그래머스 SQL Lv.3 [대여 기록이 존재하는 자동차 리스트 구하기] (0) | 2023.02.16 |
프로그래머스 SQL Lv.1 [평균 일일 대여 요금 구하기] (0) | 2023.02.16 |
프로그래머스 SQL Lv.1 [특정 옵션이 포함된 자동차 리스트 구하기] (0) | 2023.02.16 |