SQL Server"无效的列名"错误|新手

时间:2018-03-24 06:46:07

标签: sql-server

我正在使用SQL Server Management Studio忙于自学SQL Server。这是产生错误的代码:

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

为什么会抛出此错误?

  

列名称无效' SalesYear'。

3 个答案:

答案 0 :(得分:1)

  

列名称无效' SalesYear'。

此列不在表SalesOrderHeader

SELECT SalesPersonID, COUNT(SalesOrderID), YEAR(OrderDate) AS SalesYear FROM Sales.SalesOrderHeader GROUP BY YEAR(OrderDate)

答案 1 :(得分:1)

这与logical query processing model有关。Sales year在这里被称为别名,根据逻辑查询处理模型,下面是按顺序执行的运算符。

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阶段执行,你的选择将在第5阶段执行..

这意味着您的别名(处于选择阶段)将在select(5之后)之后的运算符中可见,但不会在它们之前。

我建议你拿一本能够很好地教授基础知识的书,我发现Itzik Ben-Gan的书很有帮助T-SQL Fundamentals Third Edition

答案 2 :(得分:0)

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

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);

感谢。