SQL代码报Missing From Keyword错误的原因咨询及修正建议
SQL代码报Missing From Keyword错误的原因咨询及修正建议
嗨,我来帮你分析下这段SQL出问题的原因,以及怎么修正它~
首先说说引发"Missing From Keyword"错误的核心原因,同时你的代码还有逻辑漏洞需要补上:
- CTE语法不符合规范:你在
ctes里写了select *, count(*) as sums FROM Trips join Users on client_id = users_id where banned = 'No' group by request_at,这里的select *包含了Trips和Users的所有列,但你只按request_at分组。在大多数SQL方言(比如PostgreSQL、开启严格模式的MySQL)中,GROUP BY子句必须包含SELECT列表里所有非聚合函数的列,这种写法会触发语法错误,有些数据库会把这类错误提示成容易混淆的"Missing From Keyword"。 - 逻辑漏洞:题目要求客户端和司机都不能被封禁,但你只关联验证了客户端的封禁状态,漏掉了司机的验证。
- 取消率计算逻辑错误:你试图用
count(ctes.id)/ctes.sums计算取消率,但ctes.sums是CTE里每个日期的总请求数,在主查询筛选取消记录后再分组的场景下,直接引用这个聚合列是不成立的,无法正确对应总请求数和取消请求数的关系。
下面是修正后的SQL代码,完全符合题目要求:
WITH valid_trips AS ( -- 先筛选出客户端和司机都未被封禁、且在指定日期范围内的请求 SELECT t.request_at, t.status FROM Trips t JOIN Users u_client ON t.client_id = u_client.users_id AND u_client.banned = 'No' JOIN Users u_driver ON t.driver_id = u_driver.users_id AND u_driver.banned = 'No' WHERE t.request_at BETWEEN '2013-10-01' AND '2013-10-03' ), daily_stats AS ( -- 按日期统计总请求数和取消请求数 SELECT request_at, COUNT(*) AS total_requests, SUM(CASE WHEN status IN ('cancelled_by_driver', 'cancelled_by_client') THEN 1 ELSE 0 END) AS cancelled_requests FROM valid_trips GROUP BY request_at ) -- 计算并格式化取消率 SELECT request_at AS `Day`, ROUND(cancelled_requests / total_requests, 2) AS `Cancellation Rate` FROM daily_stats;
我再给你拆解下修正的关键点:
- 用两次JOIN分别验证客户端和司机的未封禁状态,完全符合题目要求;
- 先通过
valid_trips锁定所有有效请求,再用daily_stats统计每日的总请求和取消请求数量; - 最后直接用取消数除以总数计算取消率,语法和逻辑都更严谨,不会出现之前的语法错误。
备注:内容来源于stack exchange,提问作者Shivani Tiwari
相关产品推荐
相关产品推荐

