MySQL WHERE日期子句字段错误及SQL代码报错原因咨询
问题2:CASE聚合SQL报错的排查与修正
从你给出的SQL片段来看,有几个明显的问题会导致报错,咱们一步步修正:
最直接的错误:字段别名不匹配
你在子查询里把HOUR(arrPurch.PurchaseDate)的结果别名为a,但外层查询却引用了Hour这个字段——MySQL根本找不到这个字段,自然会报错。
其他潜在问题
- 派生表缺少别名:MySQL要求子查询作为派生表时必须有别名,你的SQL里子查询只写了开头,没加
) AS sub这样的别名,这也是常见报错点。 - 子查询字段不完整:外层的
SUM(CASE...)需要用到col和data字段,你的子查询必须明确返回这两个字段,否则会报“Unknown column”错误。 - 分组缺失:既然是按小时聚合,外层查询必须加上
GROUP BY子句,否则所有数据会被聚合为一行,不符合你的需求。
修正后的完整SQL示例
SELECT hour_col AS `Hour`, SUM(CASE col WHEN '1' THEN data ELSE 0 END) AS `Sun`, SUM(CASE col WHEN '2' THEN data ELSE 0 END) AS `Mon`, SUM(CASE col WHEN '3' THEN data ELSE 0 END) AS `Tues`, SUM(CASE col WHEN '4' THEN data ELSE 0 END) AS `Wed`, SUM(CASE col WHEN '5' THEN data ELSE 0 END) AS `Thur`, SUM(CASE col WHEN '6' THEN data ELSE 0 END) AS `Fri`, SUM(CASE col WHEN '7' THEN data ELSE 0 END) AS `Sat` FROM ( -- 子查询必须返回聚合需要的所有字段,补全你的业务逻辑 SELECT HOUR(arrPurch.PurchaseDate) AS hour_col, col, data FROM arrPurch -- 这里可以添加子查询的过滤条件,比如日期范围 -- WHERE PurchaseDate BETWEEN '2024-01-01 00:00:00' AND '2024-01-31 23:59:59' ) AS sub_query -- 给派生表加别名 GROUP BY hour_col; -- 按小时分组,确保聚合逻辑正确
如果data字段是字符串类型,记得转成数值再求和,比如把data改成CAST(data AS UNSIGNED),避免SUM时出错。
内容的提问来源于stack exchange,提问作者Ryan Dahl
相关产品推荐
相关产品推荐

