我有一张这样的表:
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中做这样的事情,我将非常感激。
答案 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))