[문제]
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.
[풀이]
1) CAR_ID, AVERAGE_DURATION 조회
2) 평균 대여 기간이므로 AVG() 집계 함수 사용
3) AVERAGE_DURATION은 소수점 두번째 자리에서 반올림 -> ROUND(, 1)
4) 대여 일수를 빼는 것이므로 DATEDIFF() 함수를 사용하고, END_DATE-START_DATE를 하면 첫 날의 값이 빠지게 되므로 +1을 통해 날짜 맞춰주기
5) AVERAGE_DURATION가 7 이상인 행만 출력이므로 조건 추가하기
5) AVERAGE_DURATION 기준으로 내림차순 & AVERAGE_DURATION이 같으면 CAR_ID 기준으로 내림차순 정렬
[오답 분석하기]
1) ROUND((DAY(END_DATE)=DAY(START_DATE)), 1)
SELECT CAR_ID,
ROUND((DAY(END_DATE)=DAY(START_DATE)), 1) AVERAGE_DURATION
..
** 지금 이 연산은 단순히 '일(day)'값이 같은지 비교하는 논리연산(boolean)
- 음수 값이 나오면서 잘못되고 있다는 것을 깨달았다. -> 날짜 차이를 계산해야 하는데, 지금 내가 한 방식으로는 두 날짜가 같은지 여부만 체크하는 거라 대여 기간 구하는데 적절하지 않다.
-> 따라서 날짜 함수인 DATEDIFF(종료 날짜, 시작 날짜)를 통해 두 기간 사이의 일수를 계산한다.
이때, 대여 시작일도 포함되므로 +1을 해준다.
SELECT CAR_ID,
AVG(DATEDIFF(END_DATE, START_DATE))+1 AVERAGE_DURATION
..
2) WHERE절로 조건 적기
..
WHERE AVG(DATEDIFF(END_DATE, START_DATE))+1 >= 7
** 집계 함수는 GROUP BY 이후에만 사용 가능하다.
- WHERE 절에서는 개별 행 단위 조건만 검사할 수 있으므로, 직접 WHERE절에 집계 함수를 쓰게 되면 SQL 문법 오류가 발생
-> 따라서 집계 함수는 HAVING 절에서 필터링해야 한다.
[정답]
SELECT CAR_ID,
ROUND(AVG(DATEDIFF(END_DATE, START_DATE))+1, 1) AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE, START_DATE))+1 >= 7
ORDER BY 2 DESC, 1 DESC;
=> 앞에서 오류가 났던 사항 2가지(HAVING & DATEDIFF()+1)를 반영시켜주면서 성공적으로 실행 완료
'코딩테스트_SQL' 카테고리의 다른 글
250327 프로그래머스 연도 별 평균 미세먼지 농도 조회하기 (0) | 2025.03.27 |
---|---|
250327 프로그래머스 조건에 맞는 아이템들의 가격의 총합 구하기 (0) | 2025.03.27 |
250324 프로그래머스 자동차 대여 기록에서 장기/단기 대여 구분하기 (0) | 2025.03.24 |
250323 프로그래머스 조건에 부합하는 중고거래 상태 조회하기 (0) | 2025.03.23 |
250321 프로그래머스 연도별 대장균 크기의 편차 구하기 (0) | 2025.03.23 |