Today
-
Yesterday
-
Total
-
  • 프로그래머스: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기
    DB/MySQL 2023. 11. 26. 00:01

    질문하기에서 많은 도움을 받은 코드

    SELECT  c.CAR_ID , 
    		c.CAR_TYPE , 
        	ROUND((c.DAILY_FEE * 30 * (100 - dp.DISCOUNT_RATE)) / 100) as FEE
    FROM CAR_RENTAL_COMPANY_CAR c
    LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN dp
           ON c.car_type = dp.car_type
    WHERE c.car_type in ('세단', 'SUV') 
        AND dp.DURATION_TYPE = '30일 이상' 
        AND c.car_id not in (
            SELECT car_id
            FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
            WHERE END_DATE >= '2022-11-01'
              AND START_DATE <= '2022-11-30'
        )
    HAVING  FEE >= 500000 AND FEE < 2000000
    ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC

    내가 헤맸던 부분은 end date , start date 조건 설정값 (🥲계산력 엉망진창..) 그리고 FEE 값을 WHERE에서 조건 검색하려고 했는데 안되었었다.

    질문하기를 둘러보다가 어느 분의 코드에 해답이 있는 것 같아서 적용했더니 정답 확인을 받았다!

    HAVING은 GROUP BY 랑만 같이 쓰는건줄 알았는데..

    HAVING 공부 ㄱㄱ 🤓

    해보려고 검색해보니 역시 Group by 절과 함께 사용하는 것이 일반적이고, 어떤 Database에서는 having 단독 사용 시 에러 메시지를 띄운다고 한다.

    근데 이 문제에서는 사용이 되었는데 운이 좋았던걸까?? having 단독 사용이 허용되는 데이터베이스를 프로그래머스가 사용하고 있어서????라는 의문이 엄청 들기 시작해서 챗봇에게 물어봤다. 히히

    [ 챗봇 해설 ] 일반적으로 HAVING은 GROUP BY와 함께 사용되지만, 이 경우에는 각각의 행에서 계산된 FEE 값을 필터링하는 데 사용되고 있습니다.

    사실 이 경우에는 HAVING 절 대신 WHERE 절에 조건을 추가하는 것이 더 적절한 방법일 것입니다. 그러나, 일부 데이터베이스 시스템에서는 이러한 사용 방식을 허용하여 쿼리가 정상적으로 작동할 수 있습니다. 그러나 이러한 사용 방식은 권장되지 않으며, 표준 SQL에서 지원되지 않을 수 있습니다.

    올바른 방법은, 먼저 FEE 계산을 서브쿼리 또는 CTE(Common Table Expression)를 사용하여 수행한 후 WHERE 절에서 조건을 적용하는 것입니다. 이렇게 하면 표준 SQL에서도 호환되고 더 명확한 코드를 작성할 수 있습니다.

    그렇다고 한다 @.@

    내 생각에도 집계함수가 쓰였다면 모를까, 집계함수가 사용된것도 아니기 때문에 having을 사용하는 것은 아닌 것 같아 앞서 작성한 코드를 응용해서 새로운 코드를 작성해 보았다.

    SELECT *
    FROM (
        SELECT 
            c.CAR_ID , 
            c.CAR_TYPE , 
            ROUND((c.DAILY_FEE * 30 * (100 - dp.DISCOUNT_RATE)) / 100) as FEE
        FROM CAR_RENTAL_COMPANY_CAR c
        LEFT JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN dp
               ON c.car_type = dp.car_type
        WHERE c.car_type in ('세단', 'SUV') 
            AND dp.DURATION_TYPE = '30일 이상' 
            AND c.car_id not in (
                SELECT car_id
                FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                WHERE END_DATE >= '2022-11-01'
                  AND START_DATE <= '2022-11-30'
            )
        ) tb
    WHERE FEE >= 500000 AND FEE < 2000000
    ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC

    🤓; FEE를 WHERE 절에서 검색하기 위한 제일 단순한 방법이 아닐까 싶었다.. 흠...

     

Designed by Tistory / Custom by 얼거스