我正在使用SQL Server Management Studio忙于自学SQL Server。这是产生错误的代码:
SELECT SalesPersonID, COUNT(SalesOrderID), YEAR(OrderDate) AS SalesYear
FROM Sales.SalesOrderHeader
GROUP BY SalesYear;
为什么会抛出此错误?
列名称无效' SalesYear'。
答案 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);
感谢。