Data house

[MYSQL] 역대급 어려운 문제 - WITH(임시테이블) 본문

Computer Knowledge/데이터베이스

[MYSQL] 역대급 어려운 문제 - WITH(임시테이블)

l._.been 2023. 5. 14. 15:11
728x90

진짜 어려웠다.. 이건 다시 공부해야한다.

with라는 임시테이블을 만들고 또 다시 쿼리문을 작성해야만 풀 수 있는 문제인데 질문하기 버튼에 사람들도 정답코드이지만 코드를 간결하게 정리하지 못한 것 같다. 

문제

https://school.programmers.co.kr/learn/courses/30/lessons/151141#qna

 

프로그래머스

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

programmers.co.kr

/*
목적 : 자동차 대여 기록 별 대여 금액 구하기
아웃풋 : 대여 기록 ID와 대여 금액 리스트
조건
1.자동차 종류가 '트럭'
2.대여 금액을 기준으로 내림차순 정렬
3.대여 기록 ID를 기준으로 내림차순 
*/
WITH base AS (
SELECT
HISTORY_ID,
CASE
    WHEN DATEDIFF(end_date,start_date)+1 < 7 THEN '노할인'
    
    WHEN DATEDIFF(end_date,start_date)+1 >= 7 
    AND DATEDIFF(end_date,start_date)+1 < 30 THEN '7일 이상'
    
    WHEN DATEDIFF(end_date,start_date)+1 >= 30 
    AND DATEDIFF(end_date,start_date)+1 < 90 THEN '30일 이상'
    
    WHEN DATEDIFF(end_date,start_date)+1 >= 90 THEN '90일 이상'
    END discount_flg,
DAILY_FEE*(DATEDIFF(end_date,start_date)+1) AS before_discount_total_fee,
car_type
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY AS t1
INNER JOIN CAR_RENTAL_COMPANY_CAR AS t2
ON t1.car_id = t2.car_id AND car_type = '트럭'
)

SELECT
HISTORY_ID,
ROUND(before_discount_total_fee * (100 - IF(DISCOUNT_RATE IS NULL, 0, DISCOUNT_RATE))*0.01) AS FEE
FROM base AS t1
LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN AS t2
ON t1.car_type = t2.car_type AND t1.discount_flg = t2.duration_type
ORDER BY 2 DESC,1 DESC