[SQL문제다시풀기] 자동차 평균 대여 기간 구하기 - datetime의 뺄셈

silver's avatar
Feb 22, 2025
[SQL문제다시풀기] 자동차 평균 대여 기간 구하기 - datetime의 뺄셈

문제

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

💡

SQL 실행 순서

  1. FROM -- 테이블 지정 및 조인 수행
  1. ON -- 조인 조건 적용 (JOIN 사용 시)
  1. WHERE -- 행(row) 단위 필터링
  1. GROUP BY -- 그룹화 수행
  1. HAVING -- 그룹화된 데이터에 대한 필터링
  1. SELECT -- 원하는 컬럼 선택 및 계산 수행
  1. ORDER BY -- 최종 정렬
  1. LIMIT -- 출력할 행 개수 제한 (옵션)

내가 작성한 오답1

: my_sql에서는 having절에 select문에서 정의한 별칭을 사용할 수 있었으나 oracle에서는 오류가 발생했다. SQL실행순서의 위에 정리해놓은 것과 같이 from - where - group by - having - select 이기때문에 select보다 먼저 실행되는 having에서는 select에서 정의한 별칭을 사용할 수 없다.
notion image

내가 작성한 오답2 - 저번과 같은 오답의 이유

: 소수점 둘째자리에서 반올림하라고 나와있는데 oracle에서 round함수를 사용하면 소수점 아래자리가 존재하지 않을경우 출력이 되지 않는다.
mysql의 경우 round함수를 사용 시 소수점 아래자리가 0이라도 출력된다.
notion image
→ oracle에서는 뒤에 .0도 출력되게 형식을 변경해야한다.
notion image

내가 작성한 정답

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

silver