ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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

    '스파르타 > TIL(Today I Learned)' 카테고리의 다른 글

    12/10 WIL  (0) 2023.12.10
    12/08  (0) 2023.12.08
    12/6  (3) 2023.12.06
    12/5  (0) 2023.12.05
    12/4  (3) 2023.12.04
Designed by Tistory.