1

我有一张这样的桌子:

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 中做这样的事情,那将不胜感激。

4

2 回答 2

1

最后一个查询就是示例。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
于 2012-10-18T16:53:04.313 回答
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)) 
于 2012-10-18T16:56:18.147 回答