- 작성한 쿼리 중 가장 긴 쿼리로
- 따로 작성한 순서에 대해 나열하며 기억하려고 하는데
- 우선 해당 문제는 아래와 같다.
- 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중
- 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고
- 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서
- 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하며
- 대여 금액을 기준으로 내림차순 정렬하고,
- 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬,
- 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬
- 여기서 테이블의 종류는 아래와 같다.
- 보유 차 종류 1번 테이블: CAR_RENTAL_COMPANY_CAR
- 렌탈 정보 2번 테이블: CAR_RENTAL_COMPANY_RENTAL_HISTORY
- 종류별 할인 3번 테이블: CAR_RENTAL_COMPANY_DISCOUNT_PLAN
- 이제 해당 문제를 해결하기 위해
- 첫 번째로는
- 1번 테이블과 2번 테이블을 LEFT JOIN 해서 차 ID 그룹으로 묶어서
- END_DATE의 일자가 2022-11-01 이전에 끝나서 렌트가 끝나거나 렌트한 날이 없다면
- 해당 그룹의 가장 나중 일자의 ROW를 조회하기
- 이후 A로 지정
- 두 번째로는
- 할인 테이블에서 문제 기간인 30일에 맞춰서
- DURATION_TYPE을 30에 맞는 걸 찾고
- 이후 CAR_TYPE이 세단 또는 SUV인것을 조회하기
- 이후 B로 지정
- 마지막으로
- 테이블간 같은 CAR_TYPE을 맡추고
- 조건을 BETWEEN을 사용해서 DAILY_FEE와 30을 곱하고
- 할인률 계산을 위해 100-DISCOUNT_RATE에 0.01을 곱하고
- 해당 값이 50만 200만 사이의 값만 조회하도록 하고
- SELECT 문에는 정수 값으로 나타내기 위해 CONVERT를 적용하는데 여기서
- 첫 번째 인자로는 계산 값을 넣어주고
- 두 번째 인자로는 UNSIGNED를 넣어주기
- UNSIGNED은 정수만
- SIGNED은 음수부터 양수까지 된다고만 기억하기
- 이런 과정을 거치고
- ORDER BY를 사용해서 원하는대로 조회 순서 적용하여 해결
SELECT A.CAR_ID, A.CAR_TYPE, CONVERT(A.DAILY_FEE*30*((100-B.DISCOUNT_RATE)*0.01),UNSIGNED) AS FEE
FROM (SELECT A.CAR_ID, A.CAR_TYPE, A.DAILY_FEE, MAX(B.END_DATE) AS END_DATE
FROM CAR_RENTAL_COMPANY_CAR A LEFT JOIN CAR_RENTAL_COMPANY_RENTAL_HISTORY B
ON A.CAR_ID = B.CAR_ID
WHERE A.CAR_TYPE IN ('SUV','세단')
GROUP BY B.CAR_ID
HAVING '2022-11-01' > MAX(B.END_DATE) OR END_DATE IS NULL) A
JOIN (
SELECT CAR_TYPE, DISCOUNT_RATE
FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
WHERE DURATION_TYPE LIKE "30%"
AND CAR_TYPE IN ('세단', 'SUV')) B
ON A.CAR_TYPE = B.CAR_TYPE
WHERE A.DAILY_FEE*30*((100-B.DISCOUNT_RATE)*0.01) BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, 2, 1 DESC