코딩테스트

[26.03.12 코테/회고(MySQL/Oracle)]-대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

지니248 2026. 3. 12. 18:45

Lv3.  대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 (MySQL)

링크: https://school.programmers.co.kr/learn/courses/30/lessons/151139?language=mysql

 

내가 작성한 코드

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 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;

 

Oracle

SELECT EXTRACT(MONTH FROM START_DATE), CAR_ID, COUNT(*) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE BETWEEN TO_DATE('2022-08-01' ,'YYYY-MM-DD') AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
  AND CAR_ID IN (SELECT CAR_ID
                 FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
                 WHERE START_DATE BETWEEN TO_DATE('2022-08-01' ,'YYYY-MM-DD') AND TO_DATE('2022-10-31', 'YYYY-MM-DD')
                 GROUP BY CAR_ID
                 HAVING COUNT(*) >= 5)
GROUP BY EXTRACT(MONTH FROM START_DATE), CAR_ID
ORDER BY EXTRACT(MONTH FROM START_DATE) ASC, CAR_ID DESC

 

문제 회고

1. 날짜 추출 EXTRACT

- TO_CHAR(START_DATE, 'MM')을 사용하였는데 계속 틀린 결과가 나옴

- 원인을 찾기 위해 제미나이 활용

- 틀린 이유:

   - TO_CHAR은 문자열임. 따라서 컴퓨터가 문자열을 정렬할 때는 숫자 크기가 아닌 사전 순서로 정렬하게 됨

   - 숫자 정렬 : 8 → 9 → 10

   - 문자 정렬 : '10'  → '8'  → '9'

   - '10'의 첫 번째 결과는 '1' 이므로 '1'이 '8'보다 앞 순서이기 때문에 ORDER BY를 오름차순으로 걸어도 10월이 맨 위로 올라온다

- 해결 방법:

   - TO_CHAR을 쓰면서 정렬도 맞게 하기

      - ORDER BY TO_NUMBER(TO_CHAR(START_DATE, 'FMMM')) ASC

      - 정렬할 때만 숫자로 다시 바꿔주는 작업(TO_NUMBER)을 해준다

      - 'FMMM' : 'Fill Mode'의 약자로 결과값 뒤에 붙은 공백이나 불필요한 0을 제거해 준다 
                        'MM'은 08을 반환하지만, 'FMMM'은 8을 반환

                      : TO_CHAR(날짜, 'FMYYYY-MM-DD')라고 쓰면 년도 뒤의 0까지 영향을 줄 수 있으므로 월만 뽑을 때 사용

   - EXTRACT 활용하기

      - EXTRACT(MONTH FROM START_DATE)

      - EXTRACT는 결과 자체가 숫자형 이므로 별도의 변환이 필요하지 않다

- 새로 배운 EXTRACT 함수

   - EXTRACT(추출할 부분 FROM 날짜 데이터)

   - 추출할 부분 : YEAR, MONTH, DAY, HOUR, MINUTE 등 

   - 오라클, MySQL에서 사용 가능