
문제
- LeetCode SQL 문제
262. Trips and Users / Hard- 문제 내용 : [링크]
내가 작성한 Query
select request_at as Day, round((count(case when status != 'completed' then 1 end)) / count(*), 2) as 'Cancellation Rate' from trips t join users c on t.client_id = c.users_id join users d on t.driver_id = d.users_id where c.banned = 'No' and d.banned = 'No' group by request_at having request_at between '2013-10-01' and '2013-10-03'
먼저 trips 테이블과 users 테이블을 JOIN 해준다. 이 때, users_id는 고객 또는 운전기사의 id이므로, 각각 client_id와 driver_id와 user_id가 일치하는 값을 JOIN 해준다.
WHERE 조건을 통해 고객과 운전기사 둘 다 banned 상태가 No인 데이터만 추출해준다.
일자별 취소율을 구해야 하므로, GROUP BY를 통해 request_at별 데이터를 그룹핑해준다.
2013-10-01 ~ 2013-10-03 데이터만 출력하므로, HAVING절을 통해 request_at이 해당 날짜에만 속하는 데이터만 필터링해준다.
GROUP BY의 기준이 되는 request_at 을 Day 컬럼으로 SELECT 해준다.
Cancellation Rate를 구해보자. 총 취소 예약 건수를 총 예약 건수로 나눠주면 된다.
CASE WHEN THEN 구문을 통해 status != completed인 데이터를 1, 나머지는 null 값으로 출력하고, 이를 COUNT 해준다. (즉, status가 completed가 아닌 데이터들의 개수를 구하기 위한 작업이다.)
전체 예약 건수를 count(*)를 통해 구해주고, 위에서 구한 취소건수를 전체 예약 건수로 나눠준다.
ROUND() 함수를 통해 Cancellation Rate를 소수 둘째자리까지 출력해준다.
⭐⭐⭐
1. CASE WHEN THEN 구문을 통해 특정 값만 Count 하는 방법
2. WHERE, HAVING 사용 구분
3. JOIN을 통해 banned 조건 구현
위 세 가지를 알고 있으면 쉽게 해결할 수 있는 문제였다.
