프로그래머스: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기

김아무개·2023년 4월 23일
0

MySQL

목록 보기
3/11

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

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 절에서 검색하기 위한 제일 단순한 방법이 아닐까 싶었다.. 흠...

더 좋은 방법이 있을것 같은데
오늘 이미 벌써 오후 6시 32분이 되었고 나는 CS 공부를 전혀 하지 못했기때문에 다음에 찾아보는것으로.....🥸

profile
Hello velog! 

0개의 댓글