来自相同数据集的SSRS(报表生成器)最小值和最大值

时间:2019-03-20 18:29:40

标签: max ssrs-2012 min reportbuilder3.0

我正在尝试从其中有错误的数据库中提取数据。我无法解决错误(这是“设计功能”),因此我不得不尝试对其进行查询。存储方式如下。

Record ID | Create Date | Update Date | Record Status
123       | 05/01/2018  | 05/01/2018  | Active
123       | 05/08/2018  | 05/08/2018  | Active
123       | 05/15/2018  | 05/15/2018  | Closed
123       | 05/22/2018  | 05/22/2018  | Closed
456       | 06/02/2018  | 06/02/2018  | Pending
456       | 06/09/2018  | 06/09/2018  | Active
456       | 06/16/2018  | 06/16/2018  | Active
456       | 06/23/2018  | 06/23/2018  | Suspended

以此类推。如您所见,“创建日期”和“更新日期”值在每一行上都匹配。 “创建日期”值应该是最初创建记录ID的日期,但实际上是作为创建记录ID更新的日期捕获的。

我需要的是一个报告,该报告为每个记录ID带来一行内容,该行向我显示最小的创建日期和最大的更新日期,以便结果看起来像这样:

Record ID | Create Date | Update Date | Record Status
123       | 05/01/2018  | 05/22/2018  | Closed
456       | 06/02/2018  | 06/23/2018  | Suspended

我已经尝试在查询设计器中使用MIN和MAX聚合函数,并且在我添加可能在记录有效期内更改的任何其他字段之前,它都可以正常工作。我明白了:

Record ID | Create Date | Update Date | Record Status
123       | 05/01/2018  | 05/08/2018  | Active
123       | 05/15/2018  | 05/22/2018  | Closed
456       | 06/02/2018  | 06/02/2018  | Pending
456       | 06/09/2018  | 06/16/2018  | Active
456       | 06/23/2018  | 06/23/2018  | Suspended

我对Report Builder还是比较陌生的,尽管我认为我很快就了解了它的概念。我在这里想念什么?

编辑后添加为当我使用查询设计器时,查询文本如下:

SELECT
  DB.RECORD.RECORD_ID
  ,DB.RECORD.RECORD_STATUS_CODE
  ,MAX(DB.RECORD.RECORD_CREATED_DATE) AS Max_RECORD_CREATED_DATE
  ,MIN(DB.RECORD.RECORD_UPDATED_DATE) AS Min_RECORD_UPDATED_DATE
FROM
  DB.RECORD
GROUP BY
  DB.RECORD.RECORD_ID
  ,DB.RECORD.RECORD_STATUS_CODE

1 个答案:

答案 0 :(得分:0)

使用CTE进行此操作的方法更为优雅,但这是一个简单的解决方案。

首先,我复制了您的数据样本并将其填充到表变量using(var reader = new StreamReader(fileName) ) { reader.BaseStream.Seek(0, SeekOrigin.End); // You can wait here for other processes to write into this file and then the ReadLine will provide you with that content var myNextLine = reader.ReadLine(); // TODO: process the line } 中。然后,我们所做的就是按recordid分组,获取最小创建日期和最大更新日期(暂时忽略状态)。我们将这个子查询加入到您的原始表中,加入recordid和更新日期,这将为我们提供记录id的最后一条记录,并从那里获取状态。

@t

这里是显示结果的SQL Fiddle的链接。此版本的唯一区别是表名称。

http://sqlfiddle.com/#!18/0bb22/1/0

更新基于您的数据集查询

这可能不是100%,因为我没有要测试的所有数据,但您可能只需要以下内容。

DECLARE @t TABLE ([Record ID] int, [Create Date] date, [Update Date] date, [Record Status] varchar(20))

INSERT INTO @t VALUES
(123, '2018-05-01', '2018-05-01', 'Active'),
(123, '2018-05-08', '2018-05-08', 'Active'),
(123, '2018-05-15', '2018-05-15', 'Closed'),
(123, '2018-05-22', '2018-05-22', 'Closed'),
(456, '2018-06-02', '2018-06-02', 'Pending'),
(456, '2018-06-09', '2018-06-09', 'Active'),
(456, '2018-06-16', '2018-06-16', 'Active'),
(456, '2018-06-23', '2018-06-23', 'Suspended')


SELECT 
     g.[Record ID], g.[Create Date], g.[Update Date], t.[Record Status]
 FROM 
    ( 
        SELECT [Record ID], MIN([Create Date]) AS [Create Date], MAX([Update Date]) AS [Update Date] 
            FROM @t
            GROUP BY [Record ID]
    ) g
    JOIN @t t ON g.[Record ID] = t.[Record ID] and g.[Update Date] = t.[Update Date]
 ORDER BY [Record ID]