我正在尝试计算每月的平均记录数,但是下面的示例代码无法正常工作。
有人可以看到我在做什么错吗?我已经检查了其他一些问题,例如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
答案 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