TIL 통합/SQL
[LEETCODE] 262. Trips and Users: WHERE절 활용
네디0318
2025. 4. 7. 15:43
https://leetcode.com/problems/trips-and-users/
어려울 것 전혀 없는 문제였으나, 괜히 어렵게 생각해서 잠시 헤맸던 문제.
[정답]
SELECT REQUEST_AT AS 'DAY'
,ROUND(COUNT(CASE WHEN STATUS LIKE 'CANCELLED%' THEN ID END)/COUNT(ID), 2) AS 'CANCELLATION RATE'
FROM TRIPS
WHERE REQUEST_AT BETWEEN '2013-10-01' AND '2013-10-03'
AND CLIENT_ID IN (SELECT USERS_ID FROM USERS WHERE BANNED = 'No')
AND DRIVER_ID IN (SELECT USERS_ID FROM USERS WHERE BANNED = 'No')
GROUP BY REQUEST_AT

포인트들
- WHERE 절을 통한 필터링
[오답]
처음의 문제풀이 방식. 단순하게 JOIN을 사용하면서 DRIVER 혹은 USER가 BANNED이 아닌 것만 조회하게 했는데, 조건을 별 생각없이 작성해서 결과도 이상하게 나왔다.
SELECT *
-- ,COUNT(CASE WHEN STATUS LIKE 'CANCELLED%' THEN ID END) AS COMPLETEDS
-- ,COUNT(ID) AS COUNTS
-- ,ROUND(COUNT(CASE WHEN STATUS LIKE 'CANCELLED%' THEN ID END)/COUNT(ID), 2) AS C_RATE
FROM TRIPS T
JOIN USERS U
ON U.USERS_ID = T.CLIENT_ID
OR U.USERS_ID = T.DRIVER_ID
WHERE REQUEST_AT BETWEEN '2013-10-01' AND '2013-10-03'
AND USERS_ID IN (SELECT USERS_ID FROM USERS WHERE BANNED = 'NO')
결과는 당연히 처참. USER_ID가 TRIPS 테이블에 중복돼서 붙어버리니 이래저래 행이 중복되고 그에 따라 결과도 이상하게 나왔다.