SQL Server按月划分月度数据,并根据该周的月份天数计算每周加权平均值

时间:2012-10-18 16:25:53

标签: sql-server tsql

我有一张这样的表:

Month          Value
2012-08-01      0.345
2012-09-01      0.543
2012-10-01      0.321
2012-11-01      0.234
2012-12-01      0.234

用户输入周数从“2012-09-29”到“2012-10-13” 输出应显示所请求范围内所有周的结果和每周的平均值,具有以下逻辑:   - 如果所有工作日完全在一个月内,只需使用该月的月度值   - 如果工作日分布在两个月以上,则将每周价值计算为两个月之间的平均值,优先考虑包含该周最多天数的月份。

如果有人可以告诉我如何在T-SQL中做这样的事情,我将非常感激。

2 个答案:

答案 0 :(得分:1)

last query就是一个例子。 Calendar表是根据请求构建的,但每个数据库都可以使用持久化的Calendar表,您可以在其上过滤日期范围。

declare @tbl table (
  Month datetime,
  Value decimal(10,3));
insert @tbl select
'2012-08-01',      0.345 union all select
'2012-09-01',      0.543 union all select
'2012-10-01',      0.321 union all select
'2012-11-01',      0.234 union all select
'2012-12-01',      0.234;

declare @start datetime, @end datetime;
select @start = '2012-09-29', @end ='2012-10-13';

;with Calendar(TheDate,StartOfWeek,StartOfMonth) as(
  select @start, @start+1-Datepart(dw,@start), @start-Day(@start)+1
  union all
  select TheDate+1, TheDate+1+1-Datepart(dw,TheDate+1),
         TheDate+1-Day(TheDate+1)+1
  from Calendar
  where TheDate < @end
)
select case when @start > v.StartOfWeek
            then @start else v.StartOfWeek end RangeStart,
       case when @end < v.StartOfWeek+6
            then @end else v.StartOfWeek+6 end RangeEnd,
       cast(avg(m.value) as decimal(10,3)) [Average]
from Calendar v
join @tbl m on v.StartOfMonth = m.Month
group by v.StartOfWeek;

输出

RANGESTART          RANGEEND            Average
September, 29 2012  September, 29 2012  0.543
September, 30 2012  October, 06 2012    0.353
October, 07 2012    October, 13 2012    0.321

答案 1 :(得分:1)

您的查询将是这样的。想法是找到下个月的第一天 DATEADD(mm,DATEDIFF(mm,0,Month)+ 1,0 。计算天数,然后你可以得到每月的总数,并根据当月和下个月的第一天之间的差异计算平均值。(SQL语法可能需要一些清理)。

declare @startdate datetime
declare  @enddate datetime

set @startdate = '2012-09-05'
set @enddate ='2012-10-13'

 Select Monthtotal/DateDiff(d,Month,NextMonth)
    FROM
        (Select 
         Month, DATEADD(mm, DATEDIFF(mm, 0, Month) + 1, 0) NextMonth, 
         DateDiff(d,Month, DATEADD(mm, DATEDIFF(mm, 0, Month) + 1, 0) * Value as Monthtotal
        FROM  DatesTable
        WHERE 
            @startdate >= Month and 
            @enddate <= DATEADD(mm, DATEDIFF(mm, 0, Month) + 1, 0))