按月/年计算平均值

时间:2018-12-31 07:59:48

标签: sql-server tsql

我正在尝试计算每月的平均记录数,但是下面的示例代码无法正常工作。

有人可以看到我在做什么错吗?我已经检查了其他一些问题,例如SQL Server - monthly avg of count,但对我来说不起作用。

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

3 个答案:

答案 0 :(得分:5)

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

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)

答案 1 :(得分:0)

使用COUNT(DISTINCT DateCreated)(必要时截断时间)查找组内不同日期的数量;将总数除以该数字:

SELECT YEAR(DateCreated) year
     , MONTH(DateCreated) month
     , COUNT(*) cnt
     , 1.0 * COUNT(*) / COUNT(DISTINCT CAST(DateCreated AS DATE)) avg
FROM #TestData
GROUP BY YEAR(DateCreated), MONTH(DateCreated)

答案 2 :(得分:0)

如果您可以使用窗口功能,则应该可以使用

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

OR

select #TestData.*
,average = avg(number) over (partition by year(DateCreated), month(DateCreated))
from #TestData

db <>提琴here