코딩테스트/SQL

[SQL] 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 - MySQL

5월._. 2023. 4. 17.
728x90

1. 문제

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

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

 

댓글