Sql server 按月/年计算平均值

Sql server 按月/年计算平均值,sql-server,tsql,Sql Server,Tsql,我试图计算每个月的平均记录数,但下面的示例代码工作不正常 有人能看出我做错了什么吗?我已经检查了一些其他问题,例如,但它不适合我 Create Table #TestData ( DateCreated datetime, Number int ) Insert into #TestData ( DateCreated, Number ) SELECT '26 Nov 2018', '10' UNION SELECT '26 Nov 2

我试图计算每个月的平均记录数,但下面的示例代码工作不正常

有人能看出我做错了什么吗?我已经检查了一些其他问题,例如,但它不适合我

Create Table #TestData
(
    DateCreated datetime,
    Number int 
)

Insert into #TestData
(
    DateCreated,
    Number
)
SELECT
    '26 Nov 2018',
    '10'
UNION
SELECT
    '26 Nov 2018',
    '11'
UNION
SELECT
    '27 Nov 2018',
    '10'
UNION
SELECT
    '28 Nov 2018',
    '11'
UNION
SELECT
    '29 Nov 2018',
    '20'
UNION
SELECT
    '30 Nov 2018',
    '35'
UNION
SELECT
    '01 Dec 2018',
    '35'
UNION
SELECT
    '02 Dec 2018',
    '40'
UNION
SELECT
    '02 Dec 2018',
    '75'

select 
    month,
    year,
    cnt,
    avg(cnt) as avg
from
(
select 
    MONTH(DateCreated) AS [month],
    YEAR(DateCreated) AS [year],
    count(*) as cnt
from 
    #TestData
group by
    MONTH(DateCreated),
    YEAR(DateCreated)
) agg
group by
    cnt,
    month,
    year

drop table #TestData

根据我们在评论中的对话,似乎您需要每个月的每日记录计数的平均值-以下是对问题代码的一个小修改,以获得:

select 
     MONTH(DateCreated) As month,
     YEAR(DateCreated) As year,
     avg(cast(cnt as float)) as avg -- cast as float otherwise you'll get an integer result
from
(
    select 
        CAST(DateCreated As Date) AS DateCreated,
        count(*) as cnt
    from 
        #TestData
    group by
        CAST(DateCreated As Date) -- group by days
) agg
group by
     MONTH(DateCreated),
     YEAR(DateCreated)

如果您可以使用窗口函数,这应该可以工作

select #TestData.*
    ,average = avg(number) over (partition by convert(varchar(7), DateCreated, 120)) 
from #TestData


dbfiddle

<代码>按cnt分组,月-年,但您的上一级别有
按月分组,年
,这意味着您只能有一个
(月,年)
,元组。您添加了额外的级别还是什么?谢谢您的回复,如果我没有这两组分组依据,我不能使用计数(*)或平均值(cnt)。外部
分组依据
(和
选择
)中的
cnt
)是您做错的。将其从外部查询中删除,您将得到您想要的结果。@ZoharPeled,您介意将其作为答案发布吗?我已经从外部查询中删除了cnt,没有差异,仍然没有得到正确的平均值。因此,您想要每个月每天的平均记录计数吗?很高兴提供帮助:-)
select #TestData.*
,average = avg(number) over (partition by year(DateCreated), month(DateCreated))
from #TestData