Sql 列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中

Sql 列在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我试图通过每年每个月获得订单数量,我发现有几个相关的函数非常有用 首先是datepart(M,OrderDate),datepart(Y,OrderDate),所以我编写代码如下: select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count from Orders group by DATEPART(Q, OrderDate), datepart(Y, OrderDate); select mo

我试图通过每年每个月获得订单数量,我发现有几个相关的函数非常有用

首先是datepart(M,OrderDate),datepart(Y,OrderDate),所以我编写代码如下:

select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count 
from Orders 
group by DATEPART(Q, OrderDate), datepart(Y, OrderDate);
select month(OrderDate) M , year(OrderDate) y, count(*) count 
from Orders 
group by month(OrderDate),year(OrderDate);
但它有一个错误: 列“Orders.OrderDate”在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

然后,我尝试使用月(DateOrder)和年(DateOrder),代码如下:

select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count 
from Orders 
group by DATEPART(Q, OrderDate), datepart(Y, OrderDate);
select month(OrderDate) M , year(OrderDate) y, count(*) count 
from Orders 
group by month(OrderDate),year(OrderDate);
上述代码的结果表明它是成功的


我的问题是为什么第一个代码有错误,而第二个代码是正确的?谢谢

因为在SELECT中,您使用了
datepart(YEAR,OrderDate)
搜索YEAR部分,而在group by中,您使用了
datepart(Y,OrderDate)
-Y并不是年份的缩写,而是代表一年中的一天

年的缩写是YY

查询的工作原理如下:

select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count 
from Orders 
group by DATEPART(Q, OrderDate), datepart(YY, OrderDate);

你可以在这张中看到-使用
YY
将给出2017年的今天,使用
Y
将给出230-因为这是今年的第230天

因为在选择中你使用了
datepart(year,OrderDate)
搜索year部分,在分组中你有
datepart(Y,OrderDate)
-Y不是年的缩写,而是一年中的某一天

年的缩写是YY

查询的工作原理如下:

select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count 
from Orders 
group by DATEPART(Q, OrderDate), datepart(YY, OrderDate);

您可以在这张中看到-使用
YY
将给出2017年的今天,使用
Y
将给出230-因为这是今年的第230天

可能是一个混淆,因为
Q
是SQL Server中的一个关键字。无论如何,您应该避免使用日期部分速记。可能会造成混淆,因为
Q
是SQL Server中的一个关键字。无论如何,您应该避免使用日期部分速记。投了赞成票,但也请验证戈登的假设。可能有多个问题。@TimBiegeleisen测试,命名列
Q
和/或在Datepart中使用
Q
,没有问题,但也请测试Gordon的假设。可能有多个问题。@TimBiegeleisen已测试,命名列
Q
和/或在Datepart中使用
Q
不会有问题