Promrammers - 자동차 대여 기록 별 대여 금액 구하기(29%)
참고링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151141
C>
Q>
H>
- case when 함수 활용
- ifnull 함수 활용
- datediff 함수 활용
- left join 후, and 조건 및 where 조건 차이에 대한 의사 결정
- left join 후 where 조건이 아닌 and 조건을 적용을 통해 값을 살려놓아야 한다.
그렇지 않으면 7일 미만의 정확한 대여금액은 빠지게 된다.
A>
A1> cube1477 님 쿼리 참고 : 공부할 수 있는 부분이 있어서 참고 하였음
SELECT
LIST.HISTORY_ID
, ROUND((LIST.DAILY_FEE * (1.0-IFNULL(CRCDP.DISCOUNT_RATE*0.01,0)))*LIST.DAYS,0) FEE
FROM(
SELECT
CRCR.HISTORY_ID
,CRCC.DAILY_FEE
,(DATEDIFF(END_DATE,START_DATE)+1) DAYS
,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 DIFF
FROM CAR_RENTAL_COMPANY_CAR CRCC
LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY CRCR
ON CRCC.CAR_ID = CRCR.CAR_ID
WHERE CRCC.CAR_TYPE = '트럭'
) LIST
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN CRCDP
ON LIST.DIFF = CRCDP.DURATION_TYPE
AND CRCDP.CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC;
A2> 김쪼이 쿼리님 참고 : 조건에 맞는 테이블들을 뽑고 조인하는 것이 이해하기 쉬워서 인상적이였음
# 1. 자동차 종류가 '트럭'
# 2. 대여 기록별로 대여금액(FEE)
# 3. 대여 기록 ID와 대여 금액 리스트를 출력
# 4. 대여 금액 기준 DESC, 기록ID DESC
select
history_id
, case when discount_rate is null
then floor(daily_fee*diff)
else floor((daily_fee*diff)*((100-discount_rate)/100)) end as fee
from (
select *
from car_rental_company_car
where car_type = '트럭'
) as car
left join (
select history_id
, car_id
, datediff(end_date,start_date)+1 as diff
, 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일 이상'
else '7일 미만' end as duration_type
from car_rental_company_rental_history
) as history
on car.car_id = history.car_id
left join (
select car_type
, duration_type
, discount_rate
from car_rental_company_discount_plan
) as discount
on car.car_type = discount.car_type
and history.duration_type = discount.duration_type
order by fee desc, history_id desc
L> Left outer 조인 이후, And 조건과 Where 조건의 차이점
L1> On 명령어 이후, and 조건 적용
SELECT t1.col1, t1.col2, t2.col1, t2.col2
FROM table1 t1
LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
AND t2.col2 = '일';
L2> Where 명령어
select t1.col1, t1.col2, t2.col1, t2.col2
from table1 t1
LEFT OUTER JOIN table2 t2
ON t1.col1 = t2.col1
where t2.col2 = '일';