SQL 알고리즘 코드카타

SQL 알고리즘 코드카타 22일차(2) 26.01.20(화)

nom_de_plume 2026. 1. 20. 09:48

부제:

대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기, 레벨 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으로 처리한다.