SQL Server中SUM+CASE+LEFT语法报错:‘2015’附近语法不正确
解决SQL Server语法错误及优化日期统计的方案
嘿,我立马就发现你问题的症结啦!你碰到的Incorrect syntax near '2015'错误,根源在于以数字开头的列别名没有被正确包裹——SQL Server不允许直接用2015Sales这种格式作为列别名,必须给它加上方括号或者双引号才行。
另外,我还想给你优化一下年份判断的逻辑:你的FP_Based_on_Comm_Date是数值型字段(格式为yyyymmm,比如2015001),完全没必要转成字符串再截取前四位,用数值运算直接提取年份会更高效,代码也更简洁。
修正后的完整SQL代码
SELECT SUM(CASE WHEN FP_Based_on_Comm_Date / 1000 = 2015 THEN Net_Value ELSE 0 END) AS [2015Sales], SUM(CASE WHEN FP_Based_on_Comm_Date / 1000 = 2016 THEN Net_Value ELSE 0 END) AS [2016Sales], SUM(CASE WHEN FP_Based_on_Comm_Date / 1000 = 2017 THEN Net_Value ELSE 0 END) AS [2017Sales], SUM(CASE WHEN FP_Based_on_Comm_Date / 1000 = 2015 THEN Eaches ELSE 0 END) AS [2015Eaches], SUM(CASE WHEN FP_Based_on_Comm_Date / 1000 = 2016 THEN Eaches ELSE 0 END) AS [2016Eaches], SUM(CASE WHEN FP_Based_on_Comm_Date / 1000 = 2017 THEN Eaches ELSE 0 END) AS [2017Eaches] FROM DB;
关键说明
- 语法错误修复:把所有以数字开头的别名(比如
2015Sales)用方括号[]包裹,SQL Server就能正确识别这些别名了。你也可以用双引号,但方括号是SQL Server更通用的写法。 - 性能优化:用
FP_Based_on_Comm_Date / 1000 = 2015代替字符串截取,因为数值运算比字符串操作更快,而且避免了类型转换可能带来的潜在问题(比如数值转字符串时的格式异常)。
如果你的FP_Based_on_Comm_Date字段里有不符合yyyymmm格式的数值,可能需要先做数据校验,但按照你描述的字段格式,这个优化完全适用。
内容的提问来源于stack exchange,提问作者GregdeLima
相关产品推荐
相关产品推荐

