언어
join on 다중 조건 & cast type 실험
땅호720
2023. 12. 13. 16:16
join on 다음에 키 컬럼을 매칭 시켜주는 것 외에도 조건을 걸 수 있다는 사실을 아셨습니까
그리고 컬럼에서 문자열이 숫자로 시작하면 (ex: 7일 이상), unsigned 타입으로 cast해줬을 때 숫자만 필터링된다!
숫자형 데이터 타입에서는 소수형(FLOAT, DECIMAL, DOUBLE)으로 cast해주었을 때 숫자로 출력이 되었다. (정수형 오류발생)
- unsigned: 양수만을 사용할 때, 양수로 더 넓은 범위를 갖고 싶을 때 지정해줌
( int: -214... ~ 214... -> unsigned 지정 시 0 ~ 429...로 범위 확장 가능)
SELECT HISTORY_ID,
round(daily_fee * (100 - if(discount_rate is null, 0, discount_rate)) / 100 * (datediff(END_DATE, START_DATE) + 1)) FEE
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY h
inner join CAR_RENTAL_COMPANY_CAR c
on c.CAR_ID = h.CAR_ID
left join CAR_RENTAL_COMPANY_DISCOUNT_PLAN p
on c.CAR_TYPE=p.CAR_TYPE
and datediff(END_DATE, START_DATE) + 1 >= CAST(p.DURATION_TYPE AS DECIMAL)
where c.car_type='트럭'
group by HISTORY_ID
order by FEE desc, HISTORY_ID desc
플랜 테이블을 조인해줄 때, car_type이 일치하는 케이스와 대여기간이 duration_type에서 나뉘는 기간 이상인 데이터(row)를 묶어준다.
이 의미는, 대여기간이 10일인 경우에 duration_type이 '7일 이상'인 케이스가 조건에 부합한다.
대여기간이 100일이 넘는 경우, duration_type '7일/30일/90일 이상'인 모든 케이스가 조건에 부합하므로 가장 마지막에 True를 반환한 '90일 이상'인 데이터가 출력된 것으로 추측된다. (플랜 테이블이 7 -> 30 -> 90일 순으로 구성되어 있다)
plan_id | car_type | duration_type | discount_rate |
1 | 세단 | 7일 이상 | 5 |
2 | 세단 | 30일 이상 | 8 |
3 | 세단 | 90일 이상 | 12 |
4 | SUV | 7일 이상 | 3 |
5 | SUV | 30일 이상 | 5 |
6 | SUV | 90일 이상 | 10 |
[참고]