SSRS递归父级仅提供不同的子级,当子级有多个父级时。

4

我使用递归父级功能制作了一个SSRS报表,用于显示值的层次树。问题是有些子元素有多个父级,但是由于我需要按ID分组才能很好地使用递归父级,因此我只看到不同的条目。这意味着即使每个子元素“应该”在报告中的多个位置上出现(在其每个父级下面),但我只能看到一次。

这里是一个示例数据集,展示了我的意思:

DECLARE @Bear Table
( ParentId  INT NOT NULL
 ,Id        INT NOT NULL
 ,Name      VARCHAR(255))

INSERT INTO @Bear
SELECT * FROM 
(SELECT 0 AS ParentId,  1 AS Id,    'Daddy Bear' AS Name    UNION
 SELECT 0 AS ParentId,  2 AS Id,    'Mummy Bear' AS Name    UNION
 SELECT 1 AS ParentId,  3 AS Id,    'Baby Bear'  AS Name    UNION
 SELECT 2 AS ParentId,  3 AS Id,    'Baby Bear'  AS Name)           AS FamilyMember
ORDER BY FamilyMember.Id

SELECT * FROM @Bear

我的实际数据中包含很多"Baby Bears",例如一个函数被多个程序使用,或者一个程序被多个报表使用。

当我制作报表时,我根据Bear.Id进行分组,并使用Bear.ParentId进行递归父级分组,这会在报表表格中给我类似下面的结果:

Level 1     Level 2
Daddy Bear
            Baby Bear
Mummy Bear

正如您所看到的,“Baby Bear”只出现了一次(通常情况下,Id应该是唯一的,这样做就很合理)。我想要的是SSRS显示更像这样的内容:

Level 1     Level 2
Daddy Bear
            Baby Bear
Mummy Bear
            Baby Bear

这将使用户更好地了解他们正在查看的实际结构。
到目前为止,我已尝试将报告组更改为按“cstr(Fields!Id.Value)& cstr(Fields!ParentId.Value)”分组,以重新建立唯一分组,以便不会将任何记录聚合成不可见性,但这将失去子项直接出现在其父项之后的排序,因此我得到了以下结果:
Level 1     Level 2
Daddy Bear
            Baby Bear
            Baby Bear
Mummy Bear

我尝试在查询中添加ROW_NUMBER() OVER (ORDER BY Id, ParentId) 作为新列进行分组,但SSRS似乎出了问题。 最终的解决方法是仅列出第一个示例中的唯一值,但在每个表行中使用操作,在单击时再次运行对应节点的报表。 然而,这远非理想。
我也搜索过谷歌,但没有结果。
我不知道该怎么办。
非常感谢您的帮助 - 我该怎么办?
谢谢您的时间,
Mark

你找到解决方案了吗?我现在也遇到了完全相同的问题。下面的带行号的答案当然不起作用,因为如果你用行号替换ID分组,就会丢失ID和父ID之间的从属关系。 - Chris Tian
1个回答

0
为什么你不能精确地添加ROW_NUMBER()呢?
SELECT ROW_NUMBER() over (order by parentid) as rn, * FROM 
(SELECT 0 AS ParentId,  1 AS Id,    'Daddy Bear' AS Name    UNION
 SELECT 0 AS ParentId,  2 AS Id,    'Mummy Bear' AS Name    UNION
 SELECT 1 AS ParentId,  3 AS Id,    'Baby Bear'  AS Name    UNION
 SELECT 2 AS ParentId,  3 AS Id,    'Baby Bear'  AS Name)           AS FamilyMember

为分组每行生成一个“唯一”的 ID。

更新

所以根据我对你问题的理解,你想要一个 递归CTE。Stack Overflow 上有很多关于它们的问题,所以我鼓励你在那里和链接中找到如何生成符合你需求的数据集的方法。


在提问时,答案是“因为我很傻,将一个INT列作为VARCHAR”,但是,解决了这个问题后,答案是排序丢失了(如问题中的第三个示例)。 - High Plains Grifter
抱歉,使用我提供的示例确实有效 - 我将检查为什么在我的实际数据中不起作用;里面肯定有其他阻止它的东西。我会发布我的发现。 - High Plains Grifter
如果您有唯一的行,您不需要在报告分组group by语句中创建人工唯一的分组。只需按rn分组,并具有ParentID的递归父项。 - Kyle Hale
每个父级只能有一个行号,因此如果添加了一个新的级别,其中“Baby bear”更名为“Young bear”(为了增加现实感),则该级别仅会出现在其父级列出的时间之一下面 - 报告中的同一记录出现两次,但由于正在对行号进行分组,因此必须是唯一的,导致与示例1相同的不同问题,但在下一级别。 - High Plains Grifter
所以,您正在尝试复制未重复的行。例如,如果Baby Bear有一个子元素,并且您想在Baby Bear的两个实例下都看到它,则必须在数据集中有两行。SSRS只会将一行放入一个分组中。 - Kyle Hale
嗨,Kyle,数据集是使用递归CTE创建的;问题在于SSRS未显示查询中的所有行(数据集中出现了两次baby bear)。正如我们所讨论的那样,我可以使用row_number()对不同列表进行分组以显示查询中的所有记录,但这会失去排序。因此,真正的问题是“是否可能在保持外观良好的分层列表的同时解除排序和分组之间的关联?”非常抱歉,我在尝试解释问题时表达得不够清楚。 - High Plains Grifter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接