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
;