【问题标题】:SSRS report with many-to-many tables in sub-tablixSSRS 报告在 sub-tablix 中具有多对多表
【发布时间】:2019-11-27 17:00:17
【问题描述】:

我有一个主表(表 A)。它与另外两个表(表 B 和表 C)具有独立的多对多关系。

我想创建一个 SSRS 报告,在表 A 中每条记录一行,然后在其中一列中为每个表 B 和表 C 显示一个子表。

我相信我可以通过为表 B 和表 C 创建一个子报告,将表 A ID 传递给这两个子报告中的每一个来做到这一点。但是,我想知道是否可以在不创建子报告的情况下做到这一点。

以下是数据结构的示例以及我希望报告的外观。

【问题讨论】:

  • 如果您能够将所有数据放入单个数据集中,您或许可以实现这一目标。将 tablix 嵌套在其他 tablix 中的主要问题是数据集通常不匹配。
  • 所以,我可以在同一个数据集中得到这一切,但数据并不完全有意义。如果表 A 中的记录与表 B 中的 2 条记录和表 C 中的 3 条记录相关,那么我的完整数据集提供 6 条记录。如果我能弄清楚如何正确地对它们进行分组,我想这在技术上不会成为问题,但我做不到。如果我们省略了表 B 或表 C,那么这是可行的,但是对于两个单独的多对多,我无法获得分组权来显示数据。由于 2x3=6 问题,我尝试的任何内容都有额外的行...
  • 因此,如果我正确地可视化您的数据,则有 6 行 - 有些应该有 NULL 值,用于 C ID 和其他 B ID... 可能可以过滤基于此进入子表。对于子表 B - IIF(IsNothing(Fields!C_ID.Value), Nothing, Fields!B_ID.Value) 或类似的东西。或者只是隐藏C_IDNULL 的行。

标签: reporting-services ssrs-tablix ssrs-2014


【解决方案1】:

这有点冗长,因为我没有任何示例数据可供使用。我创建了如下示例数据。

CREATE TABLE TableA(aID int, a1 varchar(20), a2 varchar(20))
GO
CREATE TABLE TableB(bID int, b1 varchar(20), b2 varchar(20))
GO
CREATE TABLE TableC(cID int, c1 varchar(20), c2 varchar(20))
GO
INSERT INTO TableA VALUES (1,'Red', 'Green'), (2,'Blue', 'Purple')

INSERT INTO TableB VALUES (1,'Dave', 'Bob'), (1,'Geoff', 'Harry'), (2,'Jane', 'Mary'), (2,'Anne', 'Sue')

INSERT INTO TableC VALUES (1,'Dog', 'Cat'), (2,'Goat', 'Cow'), (2,'Sheep', 'Lamb'), (2,'Donkey', 'Horse'), (2,'Lizard', 'Frog')

然后我创建了一个将表连接在一起的查询,它包含一个“TableName”列来指示它来自哪个表,我们将使用它来排列矩阵中的列。它还包含每个表的每一行的行号。查询如下所示。

SELECT 
    * 
    , RowN = ROW_NUMBER() OVER(PARTITION BY aID, TableName ORDER BY ID, FirstColumn, SecondColumn)
    FROM (
SELECT 
        a.*
        , 'Table B' as TableName
        , bID as ID, b1 as FirstColumn, b2 as SecondColumn
    FROM TableA a 
        JOIN TableB b on a.aID = b.bID
UNION ALL
SELECT 
        a.*
        , 'Table C' as TableName
        , c.*
    FROM TableA a 
        JOIN TableC c on a.aID = c.cID
    ) u

在端口设计器中,我添加了一个矩阵控件。我将行组设置为按aIDRown 分组,并按TableName 添加了一个列组。

最后我将前三列Hide duplicates属性设置为DataSet1

报告设计如下所示..

最终的输出是这样的……

它并不完美,但应该足以让你继续前进。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多