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

5

我正在学习使用SQL Server,使用SQL Server Management Studio。以下是产生错误的代码:

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

为什么会出现这个错误?
“SalesYear”列名无效。

1
在 SQL 中,GROUP BYSELECT 之前被评估。因此别名 SalesYearGROUP BY 不可用。您必须使用 GROUP BY YEAR(OrderDate) - Giorgos Betsos
你需要使用 GROUP BY YEAR(OrderDate)。在 Group By 中不能使用别名。 - Ayush Goyal
3个回答

1
这与逻辑查询处理模型有关..这里称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

在上述步骤中,分组将在第三阶段执行,而您的选择将在第五阶段执行。
这意味着您的别名(位于选择阶段)将对选择后的操作员可见(在第5个阶段之后),但在此之前不可见。
我建议您阅读一本基础教材,我发现Itzik Ben-Gan的书非常有帮助T-SQL Fundamentals Third Edition

1

无效的列名“SalesYear”。

在表SalesOrderHeader中不会有这一列。

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


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

谢谢。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接