存在大量与“每个
GROUP BY
表达式必须包含至少一列不是外部引用”相关的问题。错误,并且在 GROUP BY
子句中包含常量值通常是导致错误的原因。GROUP BY
子句中使用常量,所以我想知道两件事:
为什么 MS SQL Server 不允许在
GROUP BY
子句中使用常量?为什么在
GROUP BY
子句中放入常量会产生 this 错误,而不是“不要在 GROUP BY
子句中放入常量,白痴。”错误?这是发生错误的一个简单示例。以下代码在第三个
SELECT
语句上崩溃,并显示不协调的错误消息。
DECLARE @demo TABLE
( groupCol1 int
, groupCol2 int);
INSERT INTO @demo VALUES(1,1);
INSERT INTO @demo VALUES(1,1);
INSERT INTO @demo VALUES(2,1);
INSERT INTO @demo VALUES(1,2);
INSERT INTO @demo VALUES(1,2);
INSERT INTO @demo VALUES(2,2);
INSERT INTO @demo VALUES(3,1);
INSERT INTO @demo VALUES(3,1);
INSERT INTO @demo VALUES(1,3);
INSERT INTO @demo VALUES(1,3);
SELECT * FROM @demo;
SELECT * FROM @demo GROUP BY groupCol1, groupCol2;
SELECT *, 'x' FROM @demo GROUP BY groupCol1, groupCol2, 'x';
产生该错误是因为查询包含逻辑错误。您有一个对于所有行都相等的
GROUP BY
表达式。因此,它将结果集分组没有意义。有些数据库系统更能容忍逻辑错误,并会尝试生成结果集。 SQL Server 不太容忍此类错误。它希望您认真思考并实际告诉它您想让它做什么。
您可以在 T-SQL 中的许多地方包含常量值 - 但不能在它们不产生逻辑差异的地方包含。
答案就是忽略常数;它们不必包含在 group by 子句中,因为它们在所有记录中都是相同的。:
将 @prevMonth 声明为 int set @prevMonth = MONTH(Getdate())-1
SELECT c.name, 2 as Report#, YEAR(Getdate()) as [Year], @prevMonth as MonthEnded ,c.agent_region,'agentaggregate' as ReportDesc
, COUNT(c.cat_id) [计数猫]
来自agent_cat c
按姓名分组
--注意 group by 子句中的所有常量值都被忽略。这是 MS SQL