SQL Server中GROUP BY无法识别新建YearMonth列问题求助
解决思路及正确写法
错误原因分析
- 原语句报错是因为
GROUP BY 'YearMonth'里的'YearMonth'是字符串常量,不是列别名。SQL Server执行顺序是先处理GROUP BY再处理SELECT的别名,无法识别这个别名,且GROUP BY必须包含至少一个基于表字段的表达式,不能全是常量。 - 按原字段
ActionDate分组计数全为1,是因为ActionDate是精确到日(或时分秒)的时间值,每条记录的时间都不重复,导致每个分组仅包含一条数据。
正确写法(三种可选)
方法1:直接在GROUP BY中使用与SELECT相同的格式化表达式
SELECT FORMAT(ActionDate, 'yyyy-MM') AS YearMonth, COUNT(*) AS Amount FROM [My_view_with_dates] GROUP BY FORMAT(ActionDate, 'yyyy-MM')
方法2:使用DATE_TRUNC(SQL Server 2022及以上版本支持,性能更优)
SELECT FORMAT(DATE_TRUNC('month', ActionDate), 'yyyy-MM') AS YearMonth, COUNT(*) AS Amount FROM [My_view_with_dates] GROUP BY DATE_TRUNC('month', ActionDate)
方法3:用DATEFROMPARTS手动截断日期(兼容旧版本SQL Server)
SELECT FORMAT(DATEFROMPARTS(YEAR(ActionDate), MONTH(ActionDate), 1), 'yyyy-MM') AS YearMonth, COUNT(*) AS Amount FROM [My_view_with_dates] GROUP BY DATEFROMPARTS(YEAR(ActionDate), MONTH(ActionDate), 1)
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

