【问题标题】:How to group this SSRS report?如何分组此 SSRS 报告?
【发布时间】:2017-09-18 02:55:02
【问题描述】:

我有一份 SSRS 报告。它看起来像这样:

它的定义是这样的:

如您所见,这只是 A 到 G 不同列中的一堆数字。这些数字按 A、B 和 C 分组。对于报告中的每一行,D、E、F、G 列是我的详细数据.问题是,对于每个组(我的意思是按 A、B、C 分组),我需要 D&E 列的所有行。对于 F&G 专栏,我不想重复。例如,对于第一组,我们可以看到 F&G 列有重复,数据 20, 30 出现了两次。基本上我想要的是这样的(注意与上述报告结果相比,重复项已被删除):

查看带有黄色背景的数据,这是我想要删除重复项的部分。我不知道如何在 SSRS 中实现这一点。希望有人能指出我正确的方向。您可以在https://www.dropbox.com/s/qxvloaeuj31m0mj/Report1.rdl?dl=1 下载我正在测试的报告。创建这个简单的报告是为了隔离我在更复杂的报告中遇到的问题。我无法改变逻辑,必须找到实现这一点的方法。提前致谢。

【问题讨论】:

  • 你说不能改变逻辑;你不能改变什么逻辑?你的手被绑在哪里了?
  • @R.Richards 我的意思是我无法更改数据库中生成报告数据的存储过程。我在问题中使用的报告只是我实际报告的简化版本。我试图使黄色背景部分成为子报表,它使用分组列的值作为子报表的参数。它确实有效,但性能不可接受,因为子报告将为每个组执行。
  • 知道了。真的很典型,对吧?如何将当前存储过程的输出插入到临时表中,然后在将其输出到报告之前处理数据以将其获取到需要的位置?可能的?我已经做到了;我并不总是喜欢它,但它确实有效。
  • 如果我正确理解您的问题,您将无法做到这一点,您必须更改您的查询
  • 谢谢@oupepasa。您对如何更改数据形状以及如何实现它有任何想法吗?我现在不知道。

标签: reporting-services ssrs-2008 ssrs-2008-r2 ssrs-tablix ssrs-grouping


【解决方案1】:

这是我的进步。我假设你想要的是大多数是你在问题中包含的最后一个屏幕截图。

我拉下你提供的RDL。感谢那!它可以使这种事情变得更加容易。

报告中的SQL是模拟数据,这对我们正在尝试的东西有好处。我假设您从现在提供数据的存储过程会给您带来类似的东西。我对将结果变为临时表进行了评论,以便使用,更改/塑造数据,然后将其返回到报告。这是我在这个答案中要去的tact。

这里是RDL的更新的SQL,遗漏了短缺的一行。

SELECT *
INTO #Report
FROM (VALUES(1,4,1,1,10,20,30),
(1,4,1,2,11,20,30),
…
(22,666,7,14,23,150,6)
) AS t(A, B, C, D,E,F,G);

SELECT A.A, A.B, A.C, A.D, A.E  -- selecting columns A thru E
FROM #Report A 

UNION ALL

SELECT DISTINCT B.A, B.B, B.C, B.F, B.G  -- union in columns F and G
FROM #Report B
ORDER BY 1, 2, 3

DROP TABLE #Report

所有这些都是用SELECT INTO创建一个带有原始结果的临时表。然后,我拆分结果,而且UNION它只回一起,只有我需要堆叠在一起的列;还使用DISTINCT你想要摆脱复制。

要在您提供的RDL中使用此功能,您必须从Tablix中删除F和G列,并用此替换SQL。这就是Tablix在设计模式中的样子。

现在,您提到有一个存储过程,您无法更改。要将存储过程中的结果置于临时表中,您需要执行2件事。

首先,在过程中以相同的形状创建温度表。表格实际上不必是临时表;您可以使其成为一个非临时表,也可以在以后删除。在临时表的情况下,DDL看起来像这样:

CREATE TABLE #Report (A int, B int, C int, D int, E int, F int, G int)

然后,您将存储过程的结果插入该温度表。

INSERT INTO #Report
EXEC usp_MyStoredProcedure

否,没有简单SELECT INTO选项,其中包含存储过程,以防您想知道。 很多人希望有。

所以,如果这是你最终进入的方式,这里就是报表的SQL可能就像。

CREATE TABLE #Report (A int, B int, C int, D int, E int, F int, G int);

INSERT INTO #Report
EXEC usp_MyStoredProcedure;

SELECT A.A, A.B, A.C, A.D, A.E  -- grabbing columns A thru E
FROM #Report A 
UNION ALL
SELECT DISTINCT B.A, B.B, B.C, B.F, B.G  -- union in columns F and G
FROM #Report B
ORDER BY 1, 2, 3

这是报表在预览模式下看起来像的内容:

希望对你有所帮助。

【讨论】:

    【解决方案2】:

    如果您需要基于 SSRS 的解决方案而不是 SQL 解决方案,您可以使用 Adjacent 组来分别控制两个后续数据集。

    • 在您的行组中,右键单击您的(Details) 组并选择Add Group > Adjacent After...
    • 在出现的 Tablix Group 窗口中,Group by [F]
    • 右键单击新的(F) 行组并转到组属性。
    • 添加一个额外的组表达式,并在[G] 上进行分组。 (您可能还想将组的名称更改为 FG)。
    • 将报告中的 F 和 G 字段移动到新行(在 FG 组中),并删除所有空列。

    详细信息组仍将显示数据集中的每一行,即 D 和 E 的每个实例。FG 组将在每个 A/B/C 组内仅显示 F 和 G 的每个不同组合一次。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多