본문 바로가기
공부 & 프로젝트/SQL

[SQL TEST 39일차] Group by, LV.3 : 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

by donnanoa82 2025. 11. 12.

코딩테스트_프로그래머스

주제 : 특정 조건을 만족하는 물고기별 수와 최대 길이 구하기

범위: Group by

레벨: Lv.3

https://school.programmers.co.kr/learn/courses/30/lessons/151139

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


문제 설명
다음은 어느 자동차 대여 회사의 자동차 대여 기록 정보를 담은 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블입니다. CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블은 아래와 같은 구조로 되어있으며, HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

 

문제
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 대여 시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들에 대해서 해당 기간 동안의 월별 자동차 ID 별 총 대여 횟수(컬럼명: RECORDS) 리스트를 출력하는 SQL문을 작성해주세요. 결과는 월을 기준으로 오름차순 정렬하고, 월이 같다면 자동차 ID를 기준으로 내림차순 정렬해주세요. 특정 월의 총 대여 횟수가 0인 경우에는 결과에서 제외해주세요.

예시
예를 들어 CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블이 다음과 같다면

 

대여 시작일을 기준으로 총 대여 횟수가 5회 이상인 자동차는 자동차 ID가 1, 2인 자동차입니다. 월 별 자동차 ID별 총 대여 횟수를 구하고 월 오름차순, 자동차 ID 내림차순으로 정렬하면 다음과 같이 나와야 합니다.

 

 


#답

WITH MORE_THAN_FIVE AS (
    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
)
SELECT
    MONTH(START_DATE) 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 MORE_THAN_FIVE)
GROUP BY CAR_ID, MONTH(START_DATE)
ORDER BY MONTH ASC, CAR_ID DESC;

 

WITH

= 임시 결과셋

WITH 이름 AS (서브쿼리)

 

  • 서브쿼리를 여러 번 재사용할 때,
  • 복잡한 서브쿼리를 이름 붙여 가독성을 높일 때,

 

#오답노트

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(*) AS RECORDS 
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING 
      SELECT COUNT(*)
      FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
      WHERE HISTORY_ID between (START_DATE >= '2022-08-01') and (END_DATE < '2022-11-01') >= 5

 

내 코드는 틀린 이유: 

문제점  설명
GROUP BY CAR_ID 만 하고 있음 MONTH별 집계가 안됨 → 월별 RECORDS 계산 자체가 불가능
HAVING 절의 서브쿼리 구조가 문법적으로 잘못됨 HAVING (SELECT ...) >= 5 형태가 되어야 하는데 현재는 비교 구조 자체가 깨짐
날짜 조건 처리 방식이 완전히 잘못됨 HISTORY_ID BETWEEN (START_DATE>=...) 는 의미가 없음
WHERE 조건이 아예 존재하지 않아서 기간 필터링이 되지 않음 → 전체 데이터 다 합쳐버림
특정 월에 0회인 경우 제외 조건도 충족하지 못함 문제 조건 미반영

 

챗지피티한테 내 코드는 왜 틀렸는지 물어봤다가 ㅋㅋㅋㅋㅋㅋㅋㅋ 다 틀렸다해서 놀람. . . 껄껄