1. 문제
프로그래머스
SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
위 테이블에서 대여 시작일(START_DATE)을 기준으로 2022년 8월부터 2022년 10월까지의 총 대여 횟수가 5회 이상인 자동차들에 대해서 각 월별 자동차 ID의 총 대여 횟수(컬럼명 : RECORDS) 리스트를 출력하는 문제. 결과는 월(컬럼명 : MONTH)을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID(CAR_ID)를 기준으로 내림차순 정렬.
출력 형태는 다음과 같아야 한다.
2. 풀이
- 대여 시작일 기준 2022년 8월부터 2022년 10월까지 :
WHERE TO_CHAR(start_date, 'YYYYMM') BETWEEN '202208' AND '202210' - 각 자동차별 8, 9, 10월의 대여 횟수의 총 합이 5 이상 :
GROUP BY car_id HAVING COUNT(history_id) >= 5 - 각 월별 자동차 ID의 총 대여 횟수 :
GROUP BY EXTRACT(MONTH FROM start_date), car_id - 월 기준 오름차순 정렬, 월이 같다면 자동차 ID 기준 내림차순 정렬
ORDER BY month, car_id DESC
우선 첫 번째로 대여 시작일 기준 22년 8월부터 22년 10월까지의 총 대여 횟수가 5회 이상인 자동차들을 알아야 한다.
SELECT car_id
FROM car_rental_company_rental_history
WHERE TO_CHAR(start_date, 'YYYYMM') BETWEEN '202208' AND '202210'
GROUP BY car_id
HAVING COUNT(history_id) >= 5
이제 이 자동차들에 대해 각 월별 자동차 ID의 대여 횟수를 구해야 한다. 월(MONTH)은 시작일(START_DATE)에서 추출하면 되고 월별 대여 횟수는 COUNT( ) 함수를 사용하면 된다. 최종 쿼리는 다음과 같다. 위에서 구한 자동차들의 ID 목록 테이블과 기존 테이블을 JOIN하여 적절하게 그룹핑을 해주는 것이다.
SELECT EXTRACT(MONTH FROM c1.start_date) AS month,
c2.car_id,
COUNT(c1.history_id) AS records
FROM car_rental_company_rental_history c1
JOIN (
SELECT car_id
FROM car_rental_company_rental_history
WHERE TO_CHAR(start_date, 'YYYYMM') BETWEEN '202208' AND '202210'
GROUP BY car_id
HAVING COUNT(history_id) >= 5
) c2 ON c2.car_id = c1.car_id
WHERE TO_CHAR(start_date, 'YYYYMM') BETWEEN '202208' AND '202210'
GROUP BY EXTRACT(MONTH FROM c1.start_date), c2.car_id
ORDER BY month, c2.car_id desc
'[Programmers] > - SQL' 카테고리의 다른 글
[Oracle][Programmers] 자동차 대여 기록 별 대여 금액 구하기 (0) | 2025.05.30 |
---|---|
[Oracle][Programmers] 특정 기간동안 대여 가능한 자동차들의 대여 비용 구하기 (1) | 2025.05.29 |
[Oracle][Programmers] 자동차 대여 기록에서 대여중/대여 가능 여부 구분하기 (1) | 2025.05.27 |
[Oracle][Programmers] 자동차 종류 별 특정 옵션이 포함된 자동차 수 구하기 (0) | 2025.05.25 |
[Oracle][Programmers] 자동차 평균 대여 기간 구하기 (0) | 2025.05.24 |