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 테이블에 중복돼서 붙어버리니 이래저래 행이 중복되고 그에 따라 결과도 이상하게 나왔다.
'TIL 통합 > SQL' 카테고리의 다른 글
[LEETCODE] Tree Node : DISTINCT - LEFT JOIN 활용 (0) | 2025.04.09 |
---|---|
[LEETCODE] [MySQL] Use window function for big data - LEAD(), LAG() 함수 (0) | 2025.04.07 |
[LEETCODE] PRODUCT SALES ANALYSIS 3 - WHERE 응용 (0) | 2025.04.05 |
[프로그래머스] 우유와 요거트가 담긴 장바구니(GROUP_CONCAT or HAVING 활용) (1) | 2025.04.03 |
[프로그래머스] GROUP BY - 입양 시각 구하기(2) (0) | 2025.04.03 |