분석하기
자동차ID, 평균 대여 기간
- 자동차 별 평균 대여 기간을 구해야 하므로 자동차 ID별로 그룹화 설정을 해야한다.
- 평균 대여 기간이 7일 이상인 데이터를 조회해야하므로 그룹화 이후에 평균 대여 기간을 구하고 그 값이 7이상인 데이터를 찾는 조건식이 필요하다.
- 데이터를 출력할 때는 소수점 두번째 자리에서 반올림해서 첫번째 자리까지만 출력되게 해야하고 보기처럼 소수 첫번째자리가 없을 경우 0으로 표시해야하므로 포맷도 필요하다. 그리고 이때 평균 대여 기간은 별칭을 사용해야 한다.
- 정렬 조건으로 평균 대여 기간 기준으로 내림차순, 같다면 자동차 ID로 내림차순 정렬을 해야한다.
실행 순서에 따른 설명
1. FROM 절
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
조회할 테이블 CAR_RENTAL_COMPANY_RENTAL_HISTORY을 FROM 절에 작성한다.
2. GROUP BY 절
GROUP BY CAR_ID
그룹화 하기 전에 조건은 없으므로 WHERE 절은 생략하고 문제에서 자동차 별 평균 대여 기간을 구하므로 자동차를 구분하는 값인 자동차 ID 컬럼을 사용하여 그룹화를 해준다.
3. HAVING 절
HAVING AVG(END_DATE - START_DATE + 1) >= 7
그룹화 이후 그룹에 대한 조건을 설정해야하므로 HAVING 절에 조건식을 작성한다. 조건이 평균 대여 기간이 7이상인 데이터를 조회하는 것이므로 END_DATE 컬럼에서 START_DATE 컬럼 값을 빼주면 된다. 근데 이때 당일 대여한 것은 0으로 처리되므로 + 1을 해서 당일 대여는 1일로 처리되도록 해준다. 이 연산식을 그룹 함수 중 평균을 구해주는 AVG 함수를 사용해서 평균을 구하고 평균이 7일 이상인 데이터를 조회해야하므로 비교연산자 >=를 사용하여 조건을 작성한다.
4. SELECT 절
SELECT
CAR_ID,
TO_CHAR(ROUND(AVG(END_DATE - START_DATE + 1), 1), 'FM9990.0') AS AVERAGE_DURATION
평균을 구하는 함수식 AVG(END_DATE - START_DATE + 1)에서 소수점 두번째 자리에서 반올림 해야하므로 반올림을 해주는 함수 ROUND함수를 사용하고 반올림할 위치를 1로 지정한다. 소수점 위치 값은 0, 1, 2, ..., n-1이다. 반올림을 하고 끝내면 원하는 출력결과를 얻을 수 없다. 왜냐하면 문제에 답은 소수점이 없을 경우 .0으로 해서 꼭 소수점 첫번째 자리까지 표기해야한다. 그러므로 이때 반올림을 하여 구한 값을 TO_CHAR 메서드로 문자 타입으로 변경하면서 포맷을 지정해서 출력해야한다.
- FM9990.99의 의미
- 9: 가변적으로 해당 자리의 숫자 값이 0이거나 없을 경우 해당 자리는 버림
- 0: 고정적으로 해당 자리의 숫자 값이 없을 경우 0으로 표시
- FM: 좌우 9로 치환된 소수점 이상의 공백 및 소수점 이하의 0을 제거
ORDER BY 절
ORDER BY ROUND(AVG(END_DATE - START_DATE + 1), 1) DESC, CAR_ID DESC;
마지막으로 최종적으로 구한 평균 대여 기간을 기준으로 내림차순 (DESC), 평균 대여 기간이 같을 경우 CAR_ID로 내림차순 (DESC) 정렬 조건을 작성한다. 이때 별칭을 사용하면 안된다. ORDER BY 절에서 별칭을 사용할 수 있다고 무조건 별칭을 사용하면 안된다. 별칭을 적용한 컬럼의 데이터타입은 TO_CHAR로 포맷을 설정해서 문자타입으로 변환한 값이므로 문자타입이다. 그렇기 때문에 문제에서 요구한 평균 대여 기간에 대해 내림차순 정렬이 불가하다. 그렇기 때문에 위의 코드 처럼 평균 대여 기간을 구하는 함수식으로 작성해야한다.
전체 코드
SELECT
CAR_ID,
TO_CHAR(ROUND(AVG(END_DATE - START_DATE + 1), 1), 'FM9990.0') AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(END_DATE - START_DATE + 1) >= 7
ORDER BY ROUND(AVG(END_DATE - START_DATE + 1), 1) DESC, CAR_ID DESC;
'프로그래머스' 카테고리의 다른 글
[프로그래머스] SQL - 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기(ORACLE) (1) | 2025.03.13 |
---|---|
[프로그래머스] SQL - 조건에 부합하는 중고거래 댓글 조회하기(ORACLE) (0) | 2025.03.11 |