我有一张表,用户输入每日人口。那天特定设施中有多少人。该表看起来类似于:
select * from stat_summary where MONTH(report_date) = 9
结果:
stat_summary_id | report_date | facility | adp
----------------------------------------------------
29 |2015-09-01 | YORK | 1855
30 |2015-09-02 | YORK | 1750
31 |2015-09-04 | YORK | 1655
32 |2015-09-04 | YORK | 1699
我想要做的是计算按月分组的平均每日人口数。如果必须重新输入更正的值,我想采用MAX(report_date)
。我的查询如下:
SELECT
MONTH(t.report_date) as 'report_month',
SUM(ss1.adp)/DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,MONTH(t.report_date)),0))),
DAY(DATEADD(DD,-1,DATEADD(MM,DATEDIFF(MM,-1,MONTH(t.report_date)),0)))
FROM
stat_summary ss1
INNER JOIN
(SELECT MAX(stat_summary_id) as 'stat_summary_id', report_date
FROM stat_summary
GROUP BY report_date
) t ON t.stat_summary_id = ss1.stat_summary_id
WHERE
ss1.facility_id = 'YORK'
AND MONTH(t.report_date) = 9
GROUP BY
MONTH(t.report_date)
ORDER BY
MONTH(t.report_date)
我引用了这个帖子: Dividing a value by number of days in a month in a date field in SQL table
我能够看到如何动态划分当月的天数,但看起来它除以当前月份(10月)有31天,当我需要查询除以引用月份为9月,有30天。
目前我的搜索结果如下:
adp
值应为176.8,因为9月份有30天,而不是31天。
答案 0 :(得分:0)
如此快速检查看起来这个公式在所有月份都会返回31。可在此处找到正确的公式:How to determine the number of days in a month in SQL Server?
datediff(day, dateadd(day, 1-day(@date), @date),
dateadd(month, 1, dateadd(day, 1-day(@date), @date)))
更精确地使用:
datediff(day, dateadd(day, 1-day(MIN(t.report_date)), MIN(t.report_date)),
dateadd(month, 1, dateadd(day, 1-day(MIN(t.report_date)), MIN(t.report_date))))
编辑:请注意原始公式实际上是正确的,问题是你在一个月而不是一天过去了。月份是1-12的数字,所以你的所有日期都是1月份。
答案 1 :(得分:0)
我应该使用
day(DateAdd(day, DateAdd(month, MONTH(t.report_date), DateAdd(Year, YEAR(t.report_date)-1900, 0)), -1)) as monthDays
另外听起来,为了获得平均值,除以该数字是错误的,只有当记录数与月中的天数匹配时才是正确的,在其他情况下,只是计数就足够了
SUM(ss1.adp)/count(ss1.adp) as average