Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在SQL中按月份和年份分组整个日历年直到本月_Sql_Sql Server_Sql Server 2008_Group By_Subquery - Fatal编程技术网

如何在SQL中按月份和年份分组整个日历年直到本月

如何在SQL中按月份和年份分组整个日历年直到本月,sql,sql-server,sql-server-2008,group-by,subquery,Sql,Sql Server,Sql Server 2008,Group By,Subquery,我有这个疑问 DECLARE @DATE datetime SELECT @Date = '2014-04-01' SELECT @Date, COUNT(*) FROM Claim C INNER JOIN Prop_Vehicles PV ON PV.Prop = C.Prop WHERE PV.Vehicle IN (1,2) AND C.DateCreate >= @DATE AND ClaimCodeId =5 我想在一年中按月份分组。比如说 April 2014 -

我有这个疑问

DECLARE @DATE datetime 
SELECT @Date = '2014-04-01' 
SELECT @Date,  COUNT(*) FROM Claim C 
INNER JOIN Prop_Vehicles PV ON PV.Prop = C.Prop
WHERE PV.Vehicle IN (1,2) AND
C.DateCreate >= @DATE AND
ClaimCodeId =5 
我想在一年中按月份分组。比如说

April 2014 - 200
May  2014 - 300
June 2014 - 500
.
.
october 2014 - 100
像这样的。如何实现?有人能帮我把@Date分为两个字段,并像我上面提到的那样,按月份分组到本月吗

我想datepart函数可以吗?让我也检查一下


提前感谢。

如果某些月份没有数据,则将跳过这些月份

若您想要所有月份数据,即使值为零,那个么您需要构造月份表并与之联接

SELECT DATEADD(MONTH, DATEDIFF(MONTH,0,C.DateCreate), 0), COUNT(*) FROM Claim C 
INNER JOIN Prop_Vehicles PV ON PV.Prop = C.Prop
and PV.Vehicle IN (1,2) AND
and C.DateCreate >= @DATE AND
AND ClaimCodeId =5 
group by DATEADD(MONTH, DATEDIFF(MONTH,0,C.DateCreate), 0)
根据最新评论

以下是获取所有月份数据以及显示年份和月份的方法

DECLARE @DATE datetime 
SELECT @Date = '2014-04-01'

;with cte
as
(
select DATEADD(month, datediff(month,0,@Date), 0) as monthVal,1 as N
union all
select DATEADD(month, datediff(month,0,@Date)+N, 0) as monthVal, N+1
FROM cte
WHERE n <=5
)
SELECT DATENAME(year, monthval) as Year, datename(month,monthVal) as Month, COUNT(*) FROM 
cte
left join Claim C
on DATEADD(month, datediff(month,0,C.DAteCreate)= cte.monthVal
INNER JOIN Prop_Vehicles PV ON PV.Prop = C.Prop
and PV.Vehicle IN (1,2) AND
and C.DateCreate >= @DATE AND
AND ClaimCodeId =5 
group by DATENAME(year, monthval) , datename(month,monthVal) 

示例数据和预期结果会有所帮助。当我删除>时,它会给出奇怪的结果,而不是将>放置在条件日期创建的位置。我给出的日期等于2014-04-01’。它没有给出任何记录,而如果我在查询中有>的话,它也有一行用于这个日期,你能解释一下你是怎么做的吗?或者是日期添加行。另外,你能帮我返回所有月份的数据吗。也许,如果我们在数字中提到月份名称和年份而不是月份名称,用户会更容易/更容易阅读。谢谢,这对我很有帮助。但我想问一下,如何使用字符串来表示月份和年份,例如2014年1月、2014年2月等,以及如何使用没有数据的月份,我担心这会产生不同的结果。例如,您所做的第一个查询给出了截止到10月的结果,但是,您最近给出的第二个查询给出的结果仅截止到9月。那里没有一个月的数据。有什么问题吗?另外,我没有在您的第二次查询中看到每个月,我的意思是没有显示数据为零的月份。因此,在这方面,它与您的第一个查询没有区别。我在您的第二个查询中发现另一个错误,即DATENAME需要3个参数,因此我添加了一个0。是否正确?@divide,根据所需月数将值从5更改为12,datename只需要2个参数,