inblog logo
|
silver
    SQL문제풀기

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

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

    문제

    school.programmers.co.kr
    https://school.programmers.co.kr/learn/courses/30/lessons/157342?language=mysql

    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

    RSS·Powered by Inblog