我试图基于每小时数据获取每周MTD和YTD值,但是我很难做到这一点。
这是我正在使用的数据:
max(Date)-一周的最后一天
ISOWeek-问题周
值-我要求和的数据
SELECT MAX(ISOWeek) AS [ISOWeek]
,MAX(Date) AS [Date]
,SUM(Value1) AS [MTD]
FROM Table1
GROUP BY ISOWeek, FORMAT(Date,'yyMM')
ORDER BY ISOWeek DESC
查询返回的内容是
ISOWeek Date MTD
29 2020-07-19 367529
28 2020-07-12 367138
27 2020-06-30 103290
27 2020-07-05 266755
26 2020-06-28 346588
25 2020-06-21 337168
这就是我想要得到的:
ISOWeek Date MTD
29 2020-07-19 261515
28 2020-07-12 184104
27 2020-07-05 103414
26 2020-06-28 432114
25 2020-06-21 346588
数据必须按ISOWeek进行分组,如果是一周又是两个月,那么我只对一周结束的那个月的MTD感兴趣。我们有数百个值,因此计划是创建MTD视图和YTD视图。如果我可以在MTD方面获得一些帮助,那么我可以完成另一项。
我几乎可以确定我所要处理的内容与WHERE子句和DATEADD有关,但我不太确定该说什么。
感谢您抽出宝贵的时间。
答案 0 :(得分:0)
我并没有真正遵循您想应用的规则,但是每个日期都应用该公式来获取Weekstart / monthend或您需要的内容。在示例中放置日期而不是当前日期。
然后按修改后的日期分组。
您可以构建一个日期维度,其中某些列(月的第一天,一周的第一天等)中具有必需的日期。这样,您将获得一个包含所有日期和每个日期匹配结果的表。
将其加入到要求的列中可能会更容易/更快。
declare @monthstart date,
@monthend date,
@weekstart date
;
select @monthstart=datefromparts(year(current_timestamp),month(current_timestamp),1);
select @monthend=EOMONTH(getdate(),0);
select @monthstart,@monthend,EOMONTH(getdate(),1) as next_month, EOMONTH(getdate(),-1) as previous_month;
select cast(DATEADD(d,1-DATEPART(WEEKDAY,current_timestamp),CURRENT_TIMESTAMP) as date) as Sunday,
cast(DATEADD(d,2-case when DATEPART(WEEKDAY,current_timestamp)=1 then 8 else DATEPART(WEEKDAY,current_timestamp) end,CURRENT_TIMESTAMP) as date) as Monday
;