MySQL嵌套CASE配合DAYOFWEEK统计周末订单报语法错误怎么解决
语法错误与逻辑问题说明
- 核心语法报错原因:
COUNT函数内的嵌套CASE语句缺少闭合的END关键字,语法结构不完整。 - 逻辑错误:误用
COUNT函数,COUNT会统计所有非NULL值,你原逻辑中写的ELSE 0会导致不满足条件的0也被计入统计,最终计数结果不符合预期。 - 其他可优化点:
DAYOFWEEK函数返回值是数字类型,不需要用字符串引号包裹;STATUS是MySQL保留关键字,作为别名时建议加反引号避免歧义。
修正后的查询语句
SELECT staff.StaffID, staff.First_name, staff.Last_name, SUM( CASE WHEN booking.Status = 'ended' THEN booking.duration ELSE 0 END ) AS duration, SUM( CASE WHEN booking.Status = 'ended' AND (DAYOFWEEK(booking.Booking_date) = 1 OR DAYOFWEEK(booking.Booking_date) = 7) THEN 1 ELSE 0 END ) AS afterhour, COALESCE( SUM(booking.Status = 'cancelled'), 0 ) AS `STATUS` FROM staff LEFT JOIN booking ON staff.StaffID = booking.convenerID GROUP BY staff.StaffID
调整说明
- 不需要嵌套两层CASE,直接把两个判断条件合并写在同一个WHEN里即可,逻辑更简洁清晰。
- 把
COUNT替换为SUM,满足条件加1,不满足加0,统计结果完全匹配你的需求。 - 所有CASE语句都补全了
END关键字,彻底解决语法报错问题。
内容的提问来源于stack exchange,提问作者Vincent
相关产品推荐
相关产品推荐

