공부/SQL
[SQL] Programmers - 자동차 평균 대여기간 구하기 <GROUP BY, HAVING, DATE>
porkbellyYam
2023. 4. 9. 17:43
문제를 풀기 앞서..
나는 멍청하고 같은 실수를 반복했다.
Problem
Solution
문제를 제대로 읽어보지 않았다. 아래의 쿼리문은 내가 처음에 신나게 작성했던 실수덩어리다.
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE DATEDIFF(END_DATE, START_DATE)+1 >=7
GROUP BY CAR_ID
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
이전에 사용해본적이 있엇던 DATEDIFF 함수를 사용하면 되겠다는 생각에 문제를 제대로 읽어보지도 않았다.
위 쿼리문을 해석해보면
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
WHERE => 대여기간이 7일 이상인 대여기록을
CAR_ID 별로 그룹화해서
CAR_ID와 그 CAR의 평균 대여기간을 소숫점 첫번째 자리까지 출력하고 정렬조건은 AVERAGE_DURATION 내림차순이고 이것이 동일할 경우 CAR_ID 내림차순으로 정렬하라
하지만 문제에서 요구하는 데이터는
대여기간이 7일 이상인 대여기록이 아닌
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서
평균 대여기간이 7일 이상인 CAR를 원했다. 그러면 WHERE 절이 잘못된 것이다.
평균대여기간이 7일 이상인 CAR의 그룹들이 필요하면 HAVING 절이 필요하다. 이것 외에는 별 문제가 없어 보인다.
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 AVG(DATEDIFF(END_DATE, START_DATE)+1) >=7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
위 쿼리문을 읽어보면
CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여기간이 7일 이상인 CAR_ID 그룹에서
CAR_ID와 소숫점 첫번째 자리까지 출력하는 AVERAGE_DURATION을 위 정렬 조건대로 출력하라.
같은 실수를 반복했다. 슬프다. 다음에는 이런 실수를 하지 말아야겠다.