2015-09-29 31 views
0

我有一張表,用戶輸入每日人口。那天在一個特定的設施中有多少人。該表類似於這樣:按引用正確月份/天數的天數劃分

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

,我能看到如何動態地在一個月的天數劃分,但看起來它是除以具有31天的當前月份(10月),當我需要查詢除以引用的具有30天的9月份時。

目前我的結果如下:

enter image description here

adp值應爲176.8,因爲還有30天月,而不是31

+0

您可以創建一個標量UDF,該標量UDF根據傳遞給它的月份返回一個月內的天數。 –

回答

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月份。

+0

請勿使用月份(t.report_date),請嘗試使用最小/最大值。月份返回1-12的數字,而函數預計一年中的某一天。 –

+0

感謝您輸入亞當,我已經嘗試了您的建議:http://pastebin.com/r5KnyzDC 但是我得到這些錯誤: '消息8120,級別16,狀態1,行3 列't.report_date '在選擇列表中無效,因爲它不包含在聚合函數或GROUP BY子句中。「# – etm124

+0

您需要改爲使用t.report_date的最小/最大值。請注意,您的第一個版本也應該能夠正常工作,當我迅速檢查出來時,我被絆倒了。 –

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