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 테이블에 중복돼서 붙어버리니 이래저래 행이 중복되고 그에 따라 결과도 이상하게 나왔다.