具有当前和上一年的周范围组的数据

Posted

技术标签:

【中文标题】具有当前和上一年的周范围组的数据【英文标题】:Data with group of week Ranges for current and previous year 【发布时间】:2016-09-21 13:44:57 【问题描述】:

我有一张表,其中包含当年和上一年的数据。此表中的各个记录代表一年中每一天发生的每笔交易。每个日期可以有多个记录。

我还在 s-s-rS 仪表板报告中显示与此表相关的数据。此报告传递了两个参数@StartDate 和@EndDate。 我需要编写一个接受@StartDate 和@EndDate 参数的SQL Server 存储过程。

我在这里面临的挑战是,根据报告传递的结束日期,我需要获取当年前 8 周的数据。此外,相同日期范围内的上一年数据会像 s-s-rS 图表上的每周细分比较一样显示。

例如,如果我的报告的结束日期是 2016-09-21,我需要获取前 8 周范围内的数据,即 (9/15-9/21,9/8-9/14,9/ 1-9/7 等等直到 7/28-8/3。)我还需要获取上一年相同日期范围的数据。

我还必须在 s-s-rS 报告端的图表的 X 轴上显示星期日期范围。

如果我能提供更多详细信息,请告诉我。 谢谢。

【问题讨论】:

我假设您只是在寻求 Tsql 帮助,而将其用于 s-s-rS 的事实只是问题的次要。首先,如果您知道您需要从结束日期起 8 周的数据,那么听起来好像不需要开始日期。考虑尽管将开始日期发送为 8 周前,然后您的存储过程不必硬编码为“返回”8 周。或者考虑将结束日期和周数作为输入参数返回。 另外,我刚刚读到您需要与上一年相同的 8 周课程。我仍然会考虑一个程序在给定开始和结束(或结束负 8 周)的情况下返回您的数据,另一个程序或只是调用处理询问这些日期的代码,减去一年并询问相同的日期(去年) 这是我正在处理的仪表板报告,因此开始日期是我传递的参数,以获取报告上的不同值。当然,我们没有使用开始日期。必须从结束日期参数本身考虑 8 周。 @paulbarbin 【参考方案1】:

如果有帮助,我会使用 UDF 生成动态日期范围。计数甚至日期表都可以解决问题。

Declare @Date2 Date = GetDate()
Declare @Date1 Date = DateAdd(DAY,-49,@Date2)

Select DateR1=Cast(RetVal as Date)
      ,DateR2=Cast(DateAdd(DAY,6,RetVal) as Date) 
 From  [dbo].[udf-Create-Range-Date](@Date1,@Date2,'WK',1)
 Order By 1 

返回

DateR1      DateR2
2016-08-03  2016-08-09
2016-08-10  2016-08-16
2016-08-17  2016-08-23
2016-08-24  2016-08-30
2016-08-31  2016-09-06
2016-09-07  2016-09-13
2016-09-14  2016-09-20
2016-09-21  2016-09-27

UDF(如果需要)

CREATE FUNCTION [dbo].[udf-Create-Range-Date] (@DateFrom datetime,@DateTo datetime,@DatePart varchar(10),@Incr int)

Returns 
@ReturnVal Table (RetVal datetime)
As
Begin
    With DateTable As (
        Select DateFrom = @DateFrom
        Union All
        Select Case @DatePart
               When 'YY' then DateAdd(YY, @Incr, df.dateFrom)
               When 'QQ' then DateAdd(QQ, @Incr, df.dateFrom)
               When 'MM' then DateAdd(MM, @Incr, df.dateFrom)
               When 'WK' then DateAdd(WK, @Incr, df.dateFrom)
               When 'DD' then DateAdd(DD, @Incr, df.dateFrom)
               When 'HH' then DateAdd(HH, @Incr, df.dateFrom)
               When 'MI' then DateAdd(MI, @Incr, df.dateFrom)
               When 'SS' then DateAdd(SS, @Incr, df.dateFrom)
               End
        From DateTable DF
        Where DF.DateFrom < @DateTo
    )
    Insert into @ReturnVal(RetVal) Select DateFrom From DateTable option (maxrecursion 32767)
    Return
End

-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','YY',1) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2020-10-01','DD',1) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-31','MI',15) 
-- Syntax Select * from [dbo].[udf-Create-Range-Date]('2016-10-01','2016-10-02','SS',1) 

编辑 - 通过加入示例

Select D.DateR1
      ,D.DateR2
      ,TotalSales = sum(S.Sales)
 From  MySalesData S
 Join (
        Select DateR1=Cast(RetVal as Date)
              ,DateR2=Cast(DateAdd(DAY,6,RetVal) as Date) 
         From  [dbo].[udf-Create-Range-Date](@Date1,@Date2,'WK',1)
      ) D 
  on  S.Date Between D.DateR1 and D.DateR2

【讨论】:

这听起来是个好主意。可能我可以将从您的函数获得的这个结果与我必须获得所需值的表连接起来。但是,我有一个 sql server 2005,它不支持表类型参数(UDF 返回表类型)。顺便说一句,真的很感谢你的想法。这无疑将我引向了某个方向。 @KashyapMNVL 已经有一段时间了,但我相信 2005 年支持 CTE 和表值函数。我倾向于将函数的结果用作 DateR1 和 DateR2 之间 SomeDate 的连接的一部分。如果我能提供进一步的帮助,请告诉我。 它确实支持 CTE。我会进一步调查并让你知道。肯定的事。如果我需要任何进一步的帮助,会通知你。干杯。 我错了。是的 2005 确实支持表值函数。我把它与表值参数混淆了。 @KashyapMNVL 感谢您的确认。如果我错了。这不会是今天早上的第一次。

以上是关于具有当前和上一年的周范围组的数据的主要内容,如果未能解决你的问题,请参考以下文章

提供来自 Main 组的子类型列表以及范围编号

JavaScript 获取日期范围从一年中的周数

从年中的周数获取日期范围

如何获取该周(周一至周日)之间的日期的周日期范围(周一至周日)

INNER JOIN 基于彼此范围内的公共时间戳的两个 BigQuery 表?

超过定义的周限制的总和