[SQL] 코드카차 5일차

양승우·2024년 10월 5일

코드카타

목록 보기
8/58

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

SELECT
    car_id
    , average_duration
FROM (
    SELECT
        *
        , round(avg(datediff(end_date, start_date)+1),1) as 'average_duration'
    FROM
        CAR_RENTAL_COMPANY_RENTAL_HISTORY
    GROUP BY
        car_id
     ) aa
WHERE
    (average_duration >= 7)
ORDER BY
    2 desc
    , 1 desc
;

datediff() 함수 및 이 함수를 쓸 때 +1을 하는 이유는 지난 4일차에서도 확인할 수 있다

average_duration이라는 칼럼명을 활용해서 WHERE절을 쓰고 싶었기 때문에 서브쿼리에서 아예 average_duration로 칼럼에 별칭을 줬고
나머진 뭐... 소수점 둘째자리에서 반올림 -> 첫째자리까지 표현 -> round() 함수에서는 1을 써야함


이 서비스에서는 공간을 둘 이상 등록한 사람을 "헤비 유저"라고 부릅니다. 헤비 유저가 등록한 공간의 정보를 아이디 순으로 조회하는 SQL문을 작성해주세요. (링크)

처음에 group by와 having까지는 했었는데,
그 뒤로 이걸 어떻게 활용해야할 지 감이 안 왔었다

그래서 막

SELECT
    id
    , name
    , host_id
FROM
    places
WHERE
    id in (SELECT
                    host_id
                FROM
                    places
                GROUP BY
                    host_id
                HAVING
                    count(id) >= 2
               )
ORDER BY
	id
;

이렇게도 해봤는데,
당연히 WHERE절에 서브쿼리를 넣어놓고 in을 쓰는 건 안 되더라...
where절 서브쿼리는 max()나 min()을 쓸 때 쓰는 걸로 하고...

그래서 JOIN으로 어떻게 되나 고민을 하다 갑자기 머릿속을 스친 아이디어
ID는 unique값이니까 차치하고,
원래 테이블에서 서브쿼리의 name과 동일한 name을 가진 row만 뽑아내면 되지 않나?

SELECT
    p.id
    , p.name
    , p.host_id
FROM
    places p
    INNER JOIN (SELECT
                    host_id
                FROM
                    places
                GROUP BY
                    host_id
                HAVING
                    count(id) >= 2
               ) aa
        ON p.host_id = aa.host_id
ORDER BY 
    ID
;
profile
어제보다 오늘 더

0개의 댓글