SQL Server中如何在GROUP BY子句中使用新建计算列?
问题原因与解决方法
为什么会报错?
SQL Server的查询执行顺序是GROUP BY早于SELECT,你在SELECT里定义的myDay和testResult别名,在执行GROUP BY的时候还没被创建,所以系统找不到这两个列。另外你的SELECT里还包含了[name]这个非聚合列,它也必须出现在GROUP BY里,否则同样会触发报错。
两种解决办法
方法1:GROUP BY中直接使用原始表达式
把SELECT里定义myDay和testResult的表达式直接写到GROUP BY里,同时加上[name]:
SELECT CAST([EvtTime] as date) AS myDay, CASE WHEN [result] LIKE '%test%' THEN 1 ELSE 0 END AS testResult, COUNT_BIG(*) AS myCount, [name] FROM [mytable] GROUP BY CAST([EvtTime] as date), CASE WHEN [result] LIKE '%test%' THEN 1 ELSE 0 END, [name]
方法2:用CTE预处理数据后再分组
先通过公用表表达式(CTE)生成包含别名的中间结果,再对中间结果执行GROUP BY:
WITH CTE_Preprocessed AS ( SELECT CAST([EvtTime] as date) AS myDay, CASE WHEN [result] LIKE '%test%' THEN 1 ELSE 0 END AS testResult, [name] FROM [mytable] ) SELECT myDay, testResult, COUNT_BIG(*) AS myCount, [name] FROM CTE_Preprocessed GROUP BY myDay, testResult, [name]
内容的提问来源于stack exchange,提问作者n179911a
相关产品推荐
相关产品推荐

