【问题标题】:Grouping SSRS report on multiple fields对多个字段的 SSRS 报告进行分组
【发布时间】:2020-01-29 20:15:56
【问题描述】:

我有一个报告,我们将调用 ReportOne,在此 ReportOne 中,我使用存储过程查询此报告的数据。存储过程查询返回两个值,即“TravelDate”和“Status”。

我的报告有四个字段,“BeginDate”、“EndDate”、“Status”和“Days”。

我的问题是,我需要按“状态”和连续天数对报告进行分组。来自 TravelDate 的连续天数。

'BeginDate' 将是第一个新日期

'EndDate' 将是最后一个连续日期。

“状态”将是状态。

'Days' 将是连续天数。

例子,

TravelDate | Status

1/1/2001   | Leave
1/2/2001   | Leave
1/3/2001   | Leave
1/5/2001   | Leave
1/6/2001   | Travel

报告将如下所示。

BeginDate | EndDate  | Status | Days

1/1/2001  | 1/3/2001 | Leave  | 3

1/5/2001  | 1/5/2001 | Leave  | 1

1/6/2001  | 1/6/2001 | Travel | 1

【问题讨论】:

  • 最好按照你想要的结果来格式化样本数据
  • 这是一个标准的差距和岛屿问题

标签: sql sql-server reporting-services ssrs-2012 ssrs-tablix


【解决方案1】:

示例

Declare @YourTable Table ([TravelDate] date,[Status] varchar(50))
Insert Into @YourTable Values 
 ('1/1/2001','Leave')
,('1/2/2001','Leave')
,('1/3/2001','Leave')
,('1/5/2001','Leave')
,('1/6/2001','Travel')


Select BeginDate=min(TravelDate)
      ,EndDate  =max(TravelDate)
      ,Status   =max(Status)
      ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
 From (
        Select * 
              ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
         From @YourTable
      ) A
 Group By Grp
 Order By BeginDate

退货

BeginDate   EndDate     Status  Days
2001-01-01  2001-01-03  Leave   3
2001-01-05  2001-01-05  Leave   1
2001-01-06  2001-01-06  Travel  1

EDIT -- 从存储过程中捕获 -- @YourTable 结构必须匹配存储过程的结构

Declare @YourTable Table ([TravelDate] date,[Status] varchar(50))
Insert Into @YourTable 
Exec youStoredProcedure

    Select BeginDate=min(TravelDate)
          ,EndDate  =max(TravelDate)
          ,Status   =max(Status)
          ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
     From (
            Select * 
                  ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
             From @YourTable
          ) A
     Group By Grp
     Order By BeginDate

编辑 - 嵌套子查询

Select BeginDate=min(TravelDate)
      ,EndDate  =max(TravelDate)
      ,Status   =max(Status)
      ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
 From (
        Select * 
              ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
         From (
                -- Your Query Here --- 
              ) A
      ) A
 Group By Grp
 Order By BeginDate

编辑 - 从 TVF 消耗

Select BeginDate=min(TravelDate)
      ,EndDate  =max(TravelDate)
      ,Status   =max(Status)
      ,Days     =datediff(DAY,min(TravelDate),max(TravelDate))+1
 From (
        Select * 
              ,Grp = DateDiff(DAY,'1900-01-01',TravelDate) - row_number() over (partition by status order by TravelDate)
         From [dbo].[YourTableValedFunction](Param1,Param2) src
      ) A
 Group By Grp
 Order By BeginDate

【讨论】:

  • 我看到这个解决方案产生了这个特定示例所需的结果。我可能忽略了一些简单的事情,因为我不太擅长 SQL,但我正在从正在执行的存储过程查询中提取示例中使用的值。我将如何将其格式化到这个查询中,其中值基本上是硬编码的。
  • 我在原始问题中提到我正在使用存储过程进行查询。该过程使用 2 个参数,一个是 SocialSecurityNumber,另一个是 OrderNumber。
  • @GustavoBarrigan 在更新的答案中,我包含了一个关于如何从存储过程中捕获结果的示例。您可能需要考虑将存储过程转换为表值函数。 TVF 可以更轻松地以不同方式使用结果。
  • @GustavoBarrigan 添加了来自 TVF 的消耗。非常值得您花时间熟悉 TVF :)
猜你喜欢
  • 2023-03-29
  • 2022-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-17
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
相关资源
最近更新 更多