我正在构建SSRS报告,并且在确定如何实现它时遇到了一些麻烦。
首先,这是数据的基本结构:
在数据库中,每个级别都有一个id和一个父ID,其中根的所有父ID(级别1的父级)都是0.此外,每个级别都有一个带有数值的列。例如,我可能有:
Level1a
ParentId = 0
Id = 1
DataValue = 42
Level2a
ParentId = 1
Id = 2
DataValue = 1
目前,我已经实现了一个公用表表达式来获取层次结构和数据级别:
WITH cteTable(id, parentId, data, level) AS
(SELECT id,
parentId,
data,
1 AS level
FROM sampleTable
WHERE (parentId = 0)
UNION ALL
SELECT b.id,
b.parentId,
b.data,
c.level + 1 AS Expr1
FROM sampleTable AS b
INNER JOIN cteTable AS c ON b.parentId= p.id
)
SELECT id,
parentId,
data,
level
FROM cteTable
因此,使用之前的示例数据,查询结果将为:
+----+----------+------+-------+
| id | parentId | data | level |
|----+----------+------+-------+
| 1 | 0 | 42 | 1 |
| 2 | 1 | 1 | 2 |
+----+----------+------+-------+
从这里开始,我需要构建一个报告,将数据汇总到根级别。例如,报告将显示id 1的数据总和为43.我不确定的一件事是水平有多深 - 有些情况下没有子级别,而其他情况下树木没有几层深。
我现在正在考虑两种选择。一种是创建一个向下钻取报告,该报告将显示每个级别的数据以及可用的总和。例如:
-Level1a SUM_LEVEL2_AND_LEVEL1a_DATA
Level2a DATA
Level2b DATA
-Level2c SUM_LEVEL3_AND_LEVEL2c_DATA
Level3a DATA
Level1b DATA
Level1c DATA
另一种方法是将数据汇总到根,并在报表中显示一个仅包含父总计的简单表。例如:
Level1a SUM_LEVEL1A_AND_ALL_CHILDREN_DATA
Level1b SUM_LEVEL1B_AND_ALL_CHILDREN_DATA
Level1c SUM_LEVEL1C_AND_ALL_CHILDREN_DATA
我似乎无法弄清楚如何使用我已经完成的谷歌搜索功能(有一个链接here似乎很有用,但我无法得到它上班)。
不能更改数据库架构。
有没有人知道我可以用来开始的任何好资源,或者对如何继续这个有任何想法?
如果我错过任何东西,请告诉我......
答案 0 :(得分:0)
我终于找到了解决这个问题的方法。
公用表表达式(CTE)是一个良好的开端。我对它做出的唯一改变是在递归定义中 - 我没有为每个孩子收集直接父母的id,而是为祖父母的id(直接父母的父ID)分配了它。这意味着为每个孩子分配了最终的父ID,而不是仅在层次结构中向上移动一步。从那里开始,在报告中使用它非常简单。
我将CTE放在它自己的存储过程中 - 唯一的目的是恢复整个层次结构。从那里,我创建了另一个存储过程,它将CTE与不同的存储过程相结合。此时,我应用了过滤器并返回了最终结果集。