본문 바로가기

반응형

문제

CAR_RENTAL_COMPANY_RENTAL_HISTORY 테이블에서 평균 대여 기간이 7일 이상인 자동차들의 자동차 ID와 평균 대여 기간(컬럼명: AVERAGE_DURATION) 리스트를 출력하는 SQL문을 작성해주세요. 평균 대여 기간은 소수점 두번째 자리에서 반올림하고, 결과는 평균 대여 기간을 기준으로 내림차순 정렬해주시고, 평균 대여 기간이 같으면 자동차 ID를 기준으로 내림차순 정렬해주세요.

구조

HISTORY_ID, CAR_ID, START_DATE, END_DATE 는 각각 자동차 대여 기록 ID, 자동차 ID, 대여 시작일, 대여 종료일을 나타냅니다.

예시


처음에 작성한 쿼리

-- 코드를 입력하세요
select 
    car_id,
    round(a.avg_term,1) AVERAGE_DURATION
from(
    SELECT
        car_id,
        avg(to_date(end_date) - to_date(start_date) + 1) avg_term
    From CAR_RENTAL_COMPANY_RENTAL_HISTORY
    group by car_id
    order by car_id) a
where AVERAGE_DURATION >= 7
order by AVERAGE_DURATION desc, car_id desc

틀린 이유

avg_term은 서브쿼리 내에 있어 바깥에서 조건등으로 이용이 가능하지만, AVERAGE_DURATION는 그렇지 않기에 이용이 불가능 합니다.


수정한 쿼리

-- 코드를 입력하세요
select 
    car_id,
    a.avg_term AVERAGE_DURATION
from(
    SELECT
        car_id,
        round(avg(to_date(end_date) - to_date(start_date) + 1),1) avg_term
    From CAR_RENTAL_COMPANY_RENTAL_HISTORY
    group by car_id
    order by car_id) a
where a.avg_term >= 7
order by a.avg_term desc, car_id desc

조건등을 깔끔하게 보기 위해, round() 처리도 서브쿼리 내에서 처리하고, 바깥에서 필터링과, 정렬을 해줍니다.

 

문제 출처 : https://school.programmers.co.kr/learn/courses/30/lessons/157342

반응형
댓글