【问题标题】:SSRS (Report Builder) Min Value and Max Value from Same DatasetSSRS(报表生成器)来自同一数据集的最小值和最大值
【发布时间】:2019-03-20 18:29:40
【问题描述】:

我正在尝试从存在错误的数据库中提取数据。我无法解决错误(这是“设计功能”),所以我必须尝试查询它。以下是它的存储方式。

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

等等。如您所见,每行的 Create Date 和 Update Date 值都匹配。 Create Date 值应该是记录 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

【问题讨论】:

  • 您介意包含使用的查询吗?似乎可以使用GROUP BY RecordID 解决此问题,但如果没有查询就很难判断。

标签: max ssrs-2012 min reportbuilder3.0


【解决方案1】:

使用 CTE 有更优雅的方法可以做到这一点,但这是一个简单的解决方案。

首先,我复制了您的数据样本并将其填充到表变量 @t 中。然后我们所做的就是按recordid分组,获取最小创建日期和最大更新日期(暂时忽略状态)。我们将此子查询加入到您的原始表中,加入记录 ID 和更新日期,这将为我们提供记录 ID 的最后一条记录并从那里获取状态。

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]

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

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

更新基于您的数据集查询

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

 SELECT 
     g.RECORD_ID, g.RECORD_CREATED_DATE, g.lastUpdateDate, t.RECORD_STATUS_CODE
 FROM 
    ( 
        SELECT RECORD_ID, MIN(RECORD_CREATED_DATE) AS RECORD_CREATED_DATE, MAX(RECORD_UPDATED_DATE) AS lastUpdateDate 
            FROM DB.RECORD
            GROUP BY RECORD_ID
    ) g
    JOIN DB.RECORD t ON g.RECORD_ID = t.RECORD_ID and g.lastUpdateDate = t.RECORD_UPDATED_DATE
 ORDER BY RECORD_ID

【讨论】:

  • SQL Fiddle 中的结果与我需要的完全一样。而且我想我知道您将使用@t 加入概念将去向何方。我不确定的是“INSERT INTO @t VALUES”行下的那个块。我在这个数据库中有超过 400,000 个记录 ID。我如何将所有这些都放入这里的 VALUES 表中? “DECLARE @t”行会为我生成它吗?
  • SELECT 之前的所有代码只是为了创建示例数据表。 @t 表只是一个临时表,我可以用它来放入数据进行测试,你不需要任何这些,你可以在 SELECT 语句中将@t 换成你的真实表。如果您查看小提琴,您会看到左侧在构建模式时创建了示例数据,右侧是从示例数据中获取结果的实际代码。
  • 我已经更新了答案以包含您的表和列名,以便(希望)更容易理解。
  • 我尝试了您建议的代码。我完全复制了它,将此处的示例字段名称替换为实际的字段名称。它没有用。我猜这是我在某个地方的错字,因为错误消息是“'.' 附近的语法不正确”。但是我不知道错误在哪里......
  • 您能否编辑您的问题并发布 DB.RECORD 表的 CREATE 脚本。在 SSMS 中右键单击它并选择“将表编写为 => CREATE 到 => 新查询窗口”如果您愿意,可以去掉所有约束和引用,并将脚本发布到您的问题中。
猜你喜欢
  • 2022-09-27
  • 1970-01-01
  • 2013-06-05
  • 2014-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
  • 1970-01-01
相关资源
最近更新 更多