문제
MYSQL
내가 작성한 정답
: mysql에서는 select에서 만든 별칭을 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 average_duration >= 7
order by 2 desc, 1 desc
ORACLE
내가 작성한 오답1
: my_sql에서는 having절에 select문에서 정의한 별칭을 사용할 수 있었으나 oracle에서는 오류가 발생했다.
SQL실행순서의 위에 정리해놓은 것과 같이 from - where - group by - having - select 이기때문에 select보다 먼저 실행되는 having에서는 select에서 정의한 별칭을 사용할 수 없다.

내가 작성한 오답2 - 저번과 같은 오답의 이유
: 소수점 둘째자리에서 반올림하라고 나와있는데 oracle에서 round함수를 사용하면 소수점 아래자리가 존재하지 않을경우 출력이 되지 않는다.
mysql의 경우 round함수를 사용 시 소수점 아래자리가 0이라도 출력된다.

→ oracle에서는 뒤에 .0도 출력되게 형식을 변경해야한다.

내가 작성한 정답
select car_id, to_char(round(avg(end_date - start_date + 1), 1), 'fm999.0') 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
여기에서 order by에 avg(end_date - start_date +1) desc를 적으면 select절에 존재하지 않는 컬럼으로 인식되어 정답으로 처리 되지 않는 것 같다
포맷 | 설명 | TO_CHAR(12.34, 포맷) | TO_CHAR(12.00, 포맷) |
FM999.9 | 소수점 한 자리까지 표시(필요하면 0 제거) | '12.3' | '12' |
FM999.0 | 항상 소수점 이하 한 자리 유지 | '12.3' | '12.0' |
FM(Fill Mode) 포맷을 적용 → 불필요한 공백이나 0을 제거
다른 사람들의 정답
SELECT CAR_ID, TO_CHAR(ROUND(AVG(END_DATE - START_DATE + 1), 1),'FM9990.09')
AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING ROUND(AVG(END_DATE - START_DATE + 1), 1) >= 7
ORDER BY TO_NUMBER(AVERAGE_DURATION) DESC, CAR_ID DESC;
1. MySQL은 HAVING에서 SELECT의 별칭을 사용할 수 있지만, Oracle은 불가능
2. Oracle에서는 HAVING이 SELECT보다 먼저 실행되기 때문
3. Oracle에서 HAVING에서 별칭을 사용하려면 서브쿼리를 사용해야 한다!
Share article