728x90
1. 문제
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를 기준으로 내림차순 정렬해주세요.
2. 풀이
FEE는 테이블에 없고 SQL 쿼리에만 존재하는 별칭인데, 이 별칭을 사용하기 위해 WHERE 대신 HAVING에 조건문을 붙였다. HAVING은 주로 GROUP BY 뒤에 붙어서 사용되지만, 이런식으로도 사용이 가능하다.(하지만 찾아보니 권장되는 방식은 아닌 듯 하다.)
WHERE은 조회하면서, HAVING은 조회한 후 결과값에서 조건에 해당되는지 파악하기 때문에 HAVING에서는 별칭을 사용할 수 있다.
HAVING을 사용하지 않고 WHERE을 사용하는 방식은 밑에 주석처리 해두었다. 둘 중에 골라서 사용하면 된다.
SELECT C.CAR_ID, C.CAR_TYPE,
ROUND(C.DAILY_FEE * 30 * (100-CAST(SUBSTR(P.DISCOUNT_RATE,-1) AS UNSIGNED))/100,0) AS FEE
FROM CAR_RENTAL_COMPANY_CAR C
INNER JOIN CAR_RENTAL_COMPANY_DISCOUNT_PLAN P
ON C.CAR_TYPE = P.CAR_TYPE AND P.DURATION_TYPE REGEXP '30'
WHERE C.CAR_TYPE IN ('세단','SUV')
# AND C.DAILY_FEE * 30 * (100-CAST(SUBSTR(P.DISCOUNT_RATE,-1) AS UNSIGNED))/100 BETWEEN 500000 AND 1999999
AND CAR_ID NOT IN (SELECT CAR_ID
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE '2022-11' BETWEEN SUBSTR(START_DATE,1,7) AND SUBSTR(END_DATE,1,7))
HAVING FEE BETWEEN 500000 AND 2000000
ORDER BY FEE DESC, CAR_TYPE ASC, CAR_ID DESC
'코딩테스트 > SQL' 카테고리의 다른 글
[SQL] 자동차 대여 기록 별 대여 금액 구하기 - MySQL (0) | 2023.04.18 |
---|---|
[SQL] 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - MySQL (0) | 2023.04.17 |
[SQL] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 - MySQL (0) | 2023.04.17 |
[SQL] 자동차 대여 기록에서 대여중 / 대여 가능 여부 구분하기 - MySQL (0) | 2023.04.16 |
[SQL] 취소되지 않은 진료예약 조회하기 - MySQL (0) | 2023.02.27 |
댓글