SQL/Programmers

Promrammers - 자동차 대여 기록 별 대여 금액 구하기(29%)

소HS군 2023. 2. 18. 21:50

참고링크 : https://school.programmers.co.kr/learn/courses/30/lessons/151141 

https://velog.io/@crosstar1228/SQL-join%ED%95%A0%EB%95%8C-on-%EA%B3%BC-where%EC%9D%98-%EC%B0%A8%EC%9D%B4 

 

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

 

 

 

AND 조건 적용했을 시,
Where 조건 적용 시,

 

 

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 = '일';