为什么下面的SQL Server查询返回12个月的数据而不是14个月的数据?



我有以下查询,返回12个月的数据。最初的查询是14天,我将datediff方法中的日改为月,以获得14个月的数据,但我只得到12个月的数据。有人能查一下原因吗?

Select 'playing' As activity 
--,ad.xDate 
,min(ad.xDate) As xDate
,Isnull(sum(t.TimePerDay),0) As TimePerDay 
From    AllDates As ad With (Nolock) 
Left Join @test As t On ad.xDate = t.date
GROUP BY datepart(Month, ad.xDate)
--ORDER BY YEAR(datepart(Month, ad.xDate)) DESC, MONTH(datepart(Month, ad.xDate)) DESC, DAY(datepart(Month, ad.xDate))
ORDER BY MIN(ad.xDate)
option (maxrecursion 0)
END

您需要按ad.xDate的月份和年份部分进行分组。一年只有12个月,你应该看到你的结果中最早的两个月(14 - 2)的总和太大,因为它们实际上代表了两个日历月的组合。

它在你的原始版本中工作,因为每个月都有超过14天。如果您试图将旧查询延长到31天以上(或某些月的28,29,30),那么您会再次发现相同的问题。

...
SELECT
    'playing' As activity,
    min(ad.xDate) As xDate, 
    Isnull(sum(t.TimePerDay), 0) As TimePerDay
FROM AllDates As ad Left Outer Join @test As t On ad.xDate = t.date
GROUP BY Year(ad.xDate), Month(ad.xDate) /* <--- change here */
ORDER BY xDate

2件事:

Select  @MaxDate = @MaxDate
,@MinDate = dateadd(Month, (@LastXMonths + 1), @MaxDate) 

@LastXMonths = -14,所以你的@MinDate只比@MaxDate早13个月。

接下来,这个语句:

GROUP BY datepart(Month, ad.xDate)

它将返回一个从1到12的数字,所以你永远不会得到超过12个月。

解决方案:

删除第一个语句中的+1,并将最后的select更改为:

Select 'playing' As activity 
,ad.xDate 
,Isnull(sum(t.TimePerDay),0) As TimePerDay 
From    AllDates As ad With (Nolock) 
Left Join @test As t On ad.xDate = t.date
GROUP BY ad.xDate
ORDER BY ad.xDate
option (maxrecursion 0)

最新更新