-
12/07스파르타/TIL(Today I Learned) 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