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