Oracle转SQL Server查询后,SSMS中聚合函数GROUP BY报错求助
解决SQL Server中聚合函数与GROUP BY的报错问题
嘿,这个问题其实是SQL Server对聚合函数和GROUP BY子句的严格规则导致的,刚接触SQL Server的话很容易碰到,别慌!
错误原因
当你在SELECT语句中使用count()这类聚合函数时,SQL Server要求:所有没有被聚合函数包裹的列,必须出现在GROUP BY子句中。这是为了确保聚合函数是基于相同分组维度来计算的——比如你要按月份、交易类型、记录类型分组统计数量,就得明确告诉SQL Server这些分组依据。
你原来的查询里,JudgmentMonth(从creation_date转换而来)、transaction_type、REPLACE(record_type, 3, 2) as RecordType这些列都没有在GROUP BY里,所以SQL Server不知道该怎么把这些列和count(column_1)的结果对应起来,就抛出了那个错误。
修正后的查询代码
我帮你调整了查询,加上了正确的GROUP BY子句,同时还清理了没用上的变量声明(你之前声明的@creation_date等变量在当前查询里没用到,可以删掉):
SELECT count(column_1) AS Volume, JudgmentMonth = RIGHT(REPLACE(CONVERT(VARCHAR(7), creation_date, 103), '/', ''), 7), transaction_type, REPLACE(record_type, 3, 2) as RecordType FROM table_1 WHERE transaction_type = 'PG' and column_1 = 'CCJ' GROUP BY RIGHT(REPLACE(CONVERT(VARCHAR(7), creation_date, 103), '/', ''), 7), transaction_type, REPLACE(record_type, 3, 2)
额外优化提示
如果你想让GROUP BY子句更简洁,也可以先用CTE(公共表表达式)把转换后的字段提前定义好,再在外层做分组统计:
WITH CTE_Trans AS ( SELECT column_1, RIGHT(REPLACE(CONVERT(VARCHAR(7), creation_date, 103), '/', ''), 7) AS JudgmentMonth, transaction_type, REPLACE(record_type, 3, 2) as RecordType FROM table_1 WHERE transaction_type = 'PG' and column_1 = 'CCJ' ) SELECT count(column_1) AS Volume, JudgmentMonth, transaction_type, RecordType FROM CTE_Trans GROUP BY JudgmentMonth, transaction_type, RecordType
内容的提问来源于stack exchange,提问作者Vinnie S
相关产品推荐
相关产品推荐

