문제 파악
- 출력할 컬럼 : 자동차 ID, 평균 대여 기간(AVERAGE_DURATION) → SELECT
- 가져올 테이블 : CAR_RENTAL_COMPANY_RENTAL_HISTORY → FROM
- 요구조건 1 : 자동차 ID별 평균 대여기간 집계 CAR_ID → group by
- 요구조건 2 : 평균 대여 기간 7일 이상인 자동차만 출력 → having
- 정렬 순서: 평균 대여 기간을 기준으로 내림차순, 자동차 ID기준 내림차순 → Order by
문제 해결 과정
💡 DATEDIFF()
✅ 두 기간 사이의 일수를 계산하는 함수
format : DATEDIFF(종료일, 시작일)
SELECT DATEDIFF('2021-01-07','2021-01-01')
>> 6
⚡ 주의할 점 !!
⇒ 날짜에 시간이 포함되어 있는 경우, 시간은 계산에 포함되지 않는다
⇒ 날짜 범위에서 벗어나는 값을 입력하는 경우 NULL 반환
💡 TIMEDIFF()
✅ 두 기간 사이의 시간을 계산하는 함수
format : TIMEDIFF(종료시간, 시작시간)
SELECT TIMEDIFF('2024-04-17 10:00:00', '2024-04-16 20:00:00')
>> 14:00:00
💡 AVG()
✅ 평균을 구하는 함수
format : AVG(컬럼명)
SELECT AVG(Start_date) from Date_date;
SELECT AVG(ISNULL(Start_date,0)) from Date_date;
⚡ 주의할 점 !!
⇒ NULL이 있을 경우 NULL값을 제외하고 평균을 계산하기 때문에 값이 달라질 수 있다.
⇒ 상황에 따라서 NULL을 0으로 대체하고 써야 함
💡 ROUND()
✅ 소수점 반올림 함수
format : ROUND(적용 대상, 반올림 자릿수)
## 1. 소수에 적용
SELECT ROUND(123.567,0) >> 소수점 모두 반올림
ROUND(123.567,1) >> 소수점 첫 번째 자리까지 반올림 = 소수점 두 번째 자리에서 반올림
ROUND(123.567,2) >> 소수점 두 번째 자리까지 반올림
>> 124
>> 123.6
>> 123.57
## 2. 정수에 적용
SELECT ROUND(12345, -1) >> 정수 첫 번째 자리 반올림 = 일의자리에서 반올림
ROUND(12345, -2) >> 정수 두 번째 자리 반올림
ROUND(12345, -3) >> 정수 세 번째 자리 반올림
>> 12350
>> 12300
>> 12000
문제 해결
> 완성 코드
select CAR_ID, round(avg(datediff(END_DATE,START_DATE)+1),1) as AVERAGE_DURATION
from CAR_RENTAL_COMPANY_RENTAL_HISTORY
group by car_id
having AVERAGE_DURATION>=7
order by AVERAGE_DURATION desc, CAR_ID desc;
'SQL > MySQL - 프로그래머스' 카테고리의 다른 글
[Lv.1] 흉부외과 또는 일반외과 의사 목록 출력하기[DATE_FORMAT] (0) | 2024.08.16 |
---|---|
[Lv.1] 평균 일일 대여 요금 구하기 [SELECT, ROUND] (0) | 2024.08.16 |
[Lv.2] 가격대 별 상품 개수 구하기 [case when, between] (0) | 2024.05.06 |
[Lv.2] 재구매가 일어난 회원 리스트 [group by, having, count] (0) | 2024.05.06 |
[Lv.2] 중복 제거하기 [count, distinct] (0) | 2024.05.06 |