DDG
2023. 12. 7. 02:48
문제
CAR_RENTAL_COMPANY_CAR 테이블과 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블과 CAR_RENTAL_COMPANY_DISCOUNT_PLAN 테이블에서 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 대여 금액을 기준으로 내림차순 정렬하고, 대여 금액이 같은 경우 자동차 종류를 기준으로 오름차순 정렬, 자동차 종류까지 같은 경우 자동차 ID를 기준으로 내림차순 정렬해주세요.
SELECT
a.CAR_ID,
a.CAR_TYPE,
ROUND((a.DAILY_FEE * ((100 - c.DISCOUNT_RATE) * 0.01)) * 30) as FEE
FROM
CAR_RENTAL_COMPANY_CAR a
INNER JOIN
CAR_RENTAL_COMPANY_RENTAL_HISTORY b ON a.CAR_ID = b.CAR_ID
INNER JOIN
CAR_RENTAL_COMPANY_DISCOUNT_PLAN c ON a.CAR_TYPE = c.CAR_TYPE
WHERE
a.CAR_TYPE IN ('세단', 'SUV')
AND c.DURATION_TYPE LIKE '%30%'
GROUP BY
a.CAR_ID
HAVING
max(b.end_date) <= '2022-11-01'
AND FEE BETWEEN 500000 AND 2000000
ORDER BY
FEE DESC, CAR_TYPE, CAR_ID;
문제를 또 못풀어서 다른 정답들을 둘러보다가
깔끔한 코드가 있어서 가져왔다.
차의 타입이 '세단' or 'SUV'인 조건을 걸어주고
일일 대여 요금에 자동차 종류 별 대여기간이 30일 이상인 경우의 할인율을 구하기 위해
like '%30% ' 로 필터링 해준다.
car_id로 group by를 해준다음
having절을 통해 조건을 설정한다.
여기서 주목할 점은 max(b.end_date)이다
이 구문을 말로 풀어보자면
그룹화된 결과 집합에서 대여 기간이 2022년 11월 1일 이전인 자동차만 선택한다.
그 값들 중 max값을 고르는데
이는 " 그룹 내에서 가장 늦은 반납일 "를 나타낸다
최대 반납일이 2022년 11월 1일 이전이면 해당 자동차는 그 기간 동안에 대여 가능한 자동차로 간주하는것이다.
https://school.programmers.co.kr/learn/courses/30/lessons/157339