2017-08-18 52 views
0

我试图按每个月每月获得订单数,我发现有几个相关函数,它们是有帮助的。列在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中

首先是DATEPART(男,订购日期),日期部分(Y,订购日期),所以我写了我的代码如下:

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

,但它的主要错误: 列 'Orders.OrderDate' 是无效的选择列表,因为它不包含在聚合函数或GROUP BY子句中。

于是,我试图用月(DateOrder)和Year(DateOrder),代码如下:

select month(OrderDate) M , year(OrderDate) y, count(*) count 
from Orders 
group by month(OrderDate),year(OrderDate); 

上面的代码的结果表明它是成功的。

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

+0

可能是混乱,因为'Q'是在SQL Server中的关键字。 –

+0

反正你应该避免使用日期部分速记。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

回答

2

因为在选择您使用datepart(YEAR, OrderDate)寻找部分,并通过你有datepart(Y, OrderDate)组 - Ÿ是不是从短短一年,但实际上代表DAYOFYEAR

https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql

简称今年是YY

查询会工作为:

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

您可以在此DEMO - 这是使用YY将给2017年的今天,使用Y会给230 - 因为它是第230天,今年

+0

Upvoted,但请测试Gordon的假设为好。可能是多个问题。 –

+0

@TimBiegeleisen经过测试,命名列'Q'和/或在Datepart中使用'Q'没有问题 –

+0

@TimBiegeleisen http://sqlfiddle.com/#!6/69008/2 –

相关问题