求助:含Group By与Case When的姓名处理SQL执行异常
问题排查与修正
核心错误点
- CASE逻辑完全偏离需求:
你当前的CASE语句逻辑是首字母为X时取前2个字符,否则取首字符,这和你要求的「首字母为X取第2-3个字符,否则去掉首字符」完全相反。 - GROUP BY与SELECT字段不匹配:
SELECT中Initailname是CASE计算的结果,但GROUP BY用的是SUBSTRING(name,1,1),两者逻辑不一致,会触发数据库的分组校验错误。 - 销售额字段引用错误:
表中销售额字段是sale amount(带空格),直接写SUM(sale)会被数据库解析为两个字段,导致语法错误。
修正后的SQL语句
通用版本(适配MySQL、SQL Server等多数数据库)
SELECT Date, phone_number, SUM(`sale amount`) AS total_sale, -- 带空格的字段需用反引号/方括号包裹 CASE WHEN SUBSTRING(name, 1, 1) = 'X' THEN SUBSTRING(name, 2, 2) -- 从第2位开始取2个字符(即第2-3位) ELSE SUBSTRING(name, 2) -- 去掉首字符,取从第2位开始的所有字符 END AS Initialname FROM table_1 GROUP BY Date, phone_number, -- GROUP BY需与SELECT中的Initialname逻辑完全一致 CASE WHEN SUBSTRING(name, 1, 1) = 'X' THEN SUBSTRING(name, 2, 2) ELSE SUBSTRING(name, 2) END
补充:不同数据库的细节差异
- MySQL:
SUBSTRING(name, 2)或SUBSTR(name, 2)均可表示从第2位取到末尾 - SQL Server:若要去掉首字符,也可使用
STUFF(name, 1, 1, '')替代SUBSTRING(name, 2, LEN(name)-1)
内容的提问来源于stack exchange,提问作者Razieh Delavar
相关产品推荐
相关产品推荐

