공부/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을 위 정렬 조건대로 출력하라.

 

같은 실수를 반복했다. 슬프다. 다음에는 이런 실수를 하지 말아야겠다.