如何每周对MTD和YTD值进行数据分组

时间:2020-07-27 14:20:56

标签: tsql group-by dateadd

我试图基于每小时数据获取每周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有关,但我不太确定该说什么。

感谢您抽出宝贵的时间。

1 个答案:

答案 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
;