프로그래머스

[프로그래머스] SQL - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(ORACLE)

Seong-Jun 2025. 3. 13. 19:57
728x90
반응형
SMALL

 

분석하기

조회할 데이터 : 월, 자동차ID, 대여횟수
대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지

 

=> CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일이 2022년 8월 ~ 10월 사이의 데이터이어야 한다.

총 대여 횟수가 5회 이상인 자동차들에 대해서

 

=> 해당 날짜에 해당하는 데이터 수가 5개 이상인 자동차ID를 알아야 한다.

결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬

 

=> 월은 ASC, 자동차ID DESC

 

전체 코드

SELECT EXTRACT(MONTH FROM START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE CAR_ID IN (
    -- 해당 기간 동안 대여 횟수가 5회 이상인 자동차ID 조회
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN TO_DATE('220801', 'YYMMDD') AND TO_DATE('221031', 'YYMMDD')
    GROUP BY CAR_ID
    HAVING COUNT(*) >= 5
)
GROUP BY EXTRACT(MONTH FROM START_DATE), CAR_ID -- 월별로 그룹화
HAVING EXTRACT(MONTH FROM START_DATE) BETWEEN 8 AND 10 -- 해당 월이 8월 ~ 10월 사이인 데이터들만 조회
ORDER BY MONTH, CAR_ID DESC;

 

실행 순서에 따른 설명

1. FROM 절

FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY

 

2. WHERE 절

WHERE CAR_ID IN (
    -- 해당 기간 동안 대여 횟수가 5회 이상인 자동차ID 조회
    SELECT CAR_ID
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
    WHERE START_DATE BETWEEN TO_DATE('220801', 'YYMMDD') AND TO_DATE('221031', 'YYMMDD')
    GROUP BY CAR_ID
    HAVING COUNT(*) >= 5
)

 

WHERE 절에서 해당 기간 동안 대여 횟수가 5회 이상인 자동차 ID를 조회하고 해당 자동차 ID와 일치하는 자동차ID를 찾는 조건식을 작성한다. TO_DATE('220801', 'YYMMDD') 이런식으로 문자열로 날짜를 지정하고 인수로 포맷방식을 작성한다. 이것을 BETWEEN AND 연산자를 사용하여 2022-08-01 ~ 2022-10-31 까지의 데이터를 구한다. 구한 데이터를 CAR_ID로 그룹화하고 해당 갯수가 5이상인 CAR_ID를 조회한다. 그렇게 조회된 CAR_ID와 일치하는 CAR_ID 전부를 찾기 위해 IN 연산자를 사용한다.

3. GROUP BY 절

GROUP BY EXTRACT(MONTH FROM START_DATE), CAR_ID -- 월별로 그룹화

 

WHERE 절에서 조회한 데이터들을 대여 시작일의 월과 자동차ID를 기준으로 그룹화를 해준다.

4. HAVING 절

HAVING EXTRACT(MONTH FROM START_DATE) BETWEEN 8 AND 10 -- 해당 월이 8월 ~ 10월 사이인 데이터들만 조회

 

그룹화를 한 후에 월 데이터가 8에서 10월 사이인 데이터를 조회하기 위한 조건을 추가한다.

5. SELECT 절

SELECT EXTRACT(MONTH FROM START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS

 

문제에서 요구한 데이터들을 조회하는 SELECT 절을 작성한다. 

 

6. ORDER BY 절

ORDER BY MONTH, CAR_ID DESC;

 

문제에서 요구한 데이터들의 정렬 조건을 작성한다.

728x90
반응형
LIST