-
프로그래머스: 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기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 절에서 검색하기 위한 제일 단순한 방법이 아닐까 싶었다.. 흠...
'DB > MySQL' 카테고리의 다른 글
프로그래머스 : 가격대 별 상품 개수 구하기 (0) 2023.11.26 프로그래머스: 5월 식품들의 총매출 조회하기 (0) 2023.11.26 프로그래머스: 주문량이 많은 아이스크림들 조회하기 (0) 2023.11.26 프로그래머스: 이름이 없는 동물의 아이디 (0) 2023.11.25 프로그래머스 : 과일로 만든 아이스크림 고르기 (0) 2023.11.25