Sql server SQL Server“;无效的列名";错误|新手

Sql server SQL Server“;无效的列名";错误|新手,sql-server,Sql Server,我正忙于自学SQLServer,使用SQLServerManagementStudio。以下是产生错误的代码: SELECT SalesPersonID, COUNT(SalesOrderID), YEAR(OrderDate) AS SalesYear FROM Sales.SalesOrderHeader GROUP BY SalesYear; 为什么会抛出这个错误 列名“SalesYear”无效 列名“SalesYear”无效 此列将不在表SalesOrderHeader 选择Sales

我正忙于自学SQLServer,使用SQLServerManagementStudio。以下是产生错误的代码:

SELECT SalesPersonID, COUNT(SalesOrderID), YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
GROUP BY SalesYear;
为什么会抛出这个错误

列名“SalesYear”无效

列名“SalesYear”无效

此列将不在表
SalesOrderHeader

选择SalesrSonid、COUNT(SalesOrderID)、YEAR(OrderDate)作为SalesYear
从Sales.SalesOrderHeader GROUP BY YEAR(OrderDate)

中,这与..
销售年份有关,此处称为别名,根据逻辑查询处理模型,下面是按顺序执行的运算符

1 FROM 
2 WHERE 
3 GROUP BY 
4 HAVING 
5 SELECT
    5.1 SELECT list
    5.2 DISTINCT
6 ORDER BY 
7 TOP / OFFSET-FETCH
因此,在上述步骤中,group by将在第3阶段执行,而您的select将在第5阶段执行

这意味着您的别名(处于选择阶段)将在选择之后(5之后)对操作员可见,但在他们之前不可见


我建议选一本基础知识教得很好的书,我发现伊齐克·本·甘的书非常有用

您可以尝试以下查询和测试,以获得预期结果

DECLARE @SalesOrderHeader TABLE(SalesPersonID INT,SalesOrderID INT,OrderDate DATETIME)
INSERT INTO @SalesOrderHeader
SELECT 1,101,'20-Mar-2018' UNION ALL SELECT 1,102,'21-Mar-2018' UNION ALL SELECT 1,102,'21-Mar-2018' UNION ALL SELECT 2,202,'21-Mar-2018'

SELECT * FROM @SalesOrderHeader

SELECT SalesPersonID AS SalesPersonID, COUNT(SalesOrderID) NoOfOrder, YEAR(OrderDate) AS SalesYear
FROM @SalesOrderHeader
GROUP BY SalesPersonID,YEAR(OrderDate);

谢谢。

在SQL
中,在选择
之前先评估分组依据。因此,
groupby
无法使用别名
saleyear
。您必须改为使用
groupby YEAR(OrderDate)
。您需要使用GROUP BY YEAR(OrderDate)。别名不能在“分组依据”中使用。