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에서 사용 가능
'코딩테스트' 카테고리의 다른 글
| [26.03.16 코테/회고(MySQL/Oracle)]-자동차 대여 기록 별 대여 금액 구하기 (0) | 2026.03.16 |
|---|---|
| [26.03.13 코테/회고(MySQL/Oracle)]-자동차 대여 기록에서 대여중/대여 가능 여부 구분하기 (0) | 2026.03.13 |
| [26.03.11 코테(MySQL/Oracle)]-특정 기간동안 대여 가능한 자동차들의 대여비용 구하기 (0) | 2026.03.11 |
| [26.03.10 코테(MySQL)]-연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기 (0) | 2026.03.10 |
| [26.03.06 코테(MySQL)]-FrontEnd 개발자 찾기 (0) | 2026.03.06 |