WITH sub_t AS (
SELECT a.CAR_ID
,a.CAR_TYPE
,a.DAILY_FEE
,b.HISTORY_ID
,b.START_DATE
,b.END_DATE
,DATEDIFF(END_DATE , START_DATE) + 1 as DAY_CNT
,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 'NONE' END AS DUR_TYPE
FROM CAR_RENTAL_COMPANY_CAR a JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY b ON a.CAR_ID = b.CAR_ID
WHERE a.CAR_TYPE = '트럭'
)
SELECT HISTORY_ID
, ROUND(DAILY_FEE * DAY_CNT * (100 - IFNULL(DISCOUNT_RATE , 0)) / 100) AS FEE
FROM sub_t a LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN b ON a.CAR_TYPE = b.CAR_TYPE
AND a.DUR_TYPE = b.DURATION_TYPE
ORDER BY 2 DESC , 1 DESC
꽤 복잡했지만,, 여러번의 시도 후 정답을 맞췄다.
여기서 병목지점은 CASE WHEN 부분이었다. FILTER 방식으로 90일 이상이 아닌 7일 이상을 먼저 세팅할 경우, 잘못된 방식으로 데이터가 필터링 될 수 있다...
순서에 유념해야 함을 배워간다.
'coding > sql 코딩테스트' 카테고리의 다른 글
[solvesql] 게임 개발사의 주력 플랫폼 찾기 (0) | 2025.01.13 |
---|---|
[solvesql] 게임 평점 예측하기 1 (0) | 2025.01.09 |
[프로그래머스] 멸종위기의 대장균 찾기 (0) | 2025.01.06 |
[solvesql] 월별 주문 리텐션 (클래식 리텐션) (0) | 2024.12.21 |
[solvesql] 유입 채널 별 실전반 전환율 (0) | 2024.12.21 |