부제:
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기, 레벨 5
1. 문제 링크:https://school.programmers.co.kr/learn/courses/30/lessons/151139
2. 정답 코드:
SELECT
date_format(start_date, '%m') as month,
car_id,
count(*) as records
FROM car_rental_company_rental_history
where start_date between '2022-08-01' and '2022-10-31'
and car_id in (
select car_id
from car_rental_company_rental_history
where start_date between '2022-08-01' and '2022-10-31'
group by car_id
having count(*) >= 5
)
group by month, car_id
order by month asc, car_id desc
3. 오류 상황:
SELECT
date_format(start_date, '%m') as month,
car_id,
count(start_date in ('2022-08%','2022-10%') as records
FROM car_rental_company_rental_history
where start_date like ('2022-08%')
and start_date like ('2022-10%')
and records >=5 and records is not 0
group by car_id
order by month asc, car_id desc
=> 서브쿼리 미사용
=> WHERE 절의 논리 오류
=> 집계와 필터링 순서 오류
4. 시도 방법:
=> 서브쿼리 활용
=> BETWEEN 활용
=> HAVING 절 활용
5. 최종 문제 해결 방법:
=> '전체 기간(8~10월) 동안 5회 이상 대여된 자동차'라는 조건과 '그 자동차들의 월별 대여 횟수'를 동시에 구해야 한다. WHERE절 안에 CAR_ID IN (SELECT CAR_ID FROM ...) 형태의 서브쿼리를 사용해 서브쿼리 내에서 8월~10월 사이 총 대여 횟수가 5회 이상인 CAR_ID만 먼저 뽑아내야 한다.
=> AND는 두 조건을 동시에 만족해야 하는데, 시작일이 8월이면서 동시에 10월일 수는 없으므로 결과가 나오지 않을 것이다. 8월부터 10월 사이를 표현하려면 BETWEEN '2022-08-01' AND '2022-10-31' 또는 >=와 <= 연산자를 사용해야 한다.
=> WHERE는 집계(COUNT)를 하기 전의 데이터를 거르는 역할이다.
- 전체 기간 5회 이상 조건은 서브쿼리의 GROUP BY와 HAVING 절에서 처리한다.
- 월별/ID별 횟수는 메인 쿼리의 GROUP BY에서 처리한다.
- COUNT(*)가 0인 경우를 제외하라는 조건은 HAVING COUNT(*) > 0으로 처리한다.
'SQL 알고리즘 코드카타' 카테고리의 다른 글
| SQL 알고리즘 코드카타 23일차(1) 26.01.21(수) (0) | 2026.01.21 |
|---|---|
| SQL 알고리즘 코드카타 22일차(3) 26.01.20(화) (0) | 2026.01.20 |
| SQL 알고리즘 코드카타 22일차(1) 26.01.20(화) (0) | 2026.01.20 |
| SQL 알고리즘 코드카타 21일차(3) 26.01.19(월) (1) | 2026.01.19 |
| SQL 알고리즘 코드카타 21일차(2) 26.01.19(월) (0) | 2026.01.19 |