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

问题描述 投票:0回答:1

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

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
max ssrs-2012 min reportbuilder3.0
1个回答
0
投票

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

首先,我将您的数据样本复制并填入表变量@t。然后我们所做的就是按记录组分组,获取最小创建日期和最大更新日期(暂时忽略状态)。我们加入这个子查询回到你的原始表,加入记录和更新日期,这将给我们记录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小提琴的链接。与此版本的唯一区别是表名。

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
© www.soinside.com 2019 - 2024. All rights reserved.