【问题标题】:Dividing by number of days not referencing correct month/number of days除以未参考正确月份/天数的天数
【发布时间】:2015-09-29 19:51:24
【问题描述】:

我有一张表格,用户可以输入每日人口。当天特定设施中有多少人。该表与此类似:

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 天。

【问题讨论】:

  • 您可以创建一个标量 UDF,根据您传递给它的月份返回一个月中的天数。

标签: sql sql-server sql-server-2008


【解决方案1】:

快速检查一下,看起来该公式在所有月份都返回 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 的数字,所以您的所有日期都是在一月份。

【讨论】:

  • 不要使用 Month(t.report_date),尝试使用 Min/Max。 Month 返回一个 1-12 的数字,而该函数需要一年中的某一天。
  • 感谢亚当的输入,我已经尝试过你的建议:pastebin.com/r5KnyzDC 但我收到了这些错误:Msg 8120, Level 16, State 1, Line 3 Column 't.report_date' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
  • 您需要取 t.report_date 的最小值/最大值。请注意,您的第一个版本也应该可以使用它,当我快速检查它时,我被它绊倒了。
【解决方案2】:

我应该使用

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2021-10-23
    • 2022-08-16
    • 2012-01-08
    • 1970-01-01
    • 1970-01-01
    • 2012-12-08
    相关资源
    最近更新 更多