1

我正在构建一个 SSRS 报告,但在弄清楚如何实施它时遇到了一些麻烦。

首先,这里是数据的基本结构:

  • 1a级
    • 2a 级
    • 2b级
    • 2c级
      • 3a 级
  • 1b级
  • 1c级

在数据库中,每个级别都有一个 id 和一个父 id,其中根(级别 1 的父级)的所有父级 id 都是 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

我似乎无法弄清楚如何让钻取报告与我所做的谷歌搜索一起工作(这里有一个链接似乎很有用,但我就是无法让它工作)。

更改数据库架构不是一种选择。

有谁知道我可以用来开始使用的任何好的资源,或者对如何进行此操作有任何想法?

如果我遗漏了什么,请告诉我...

4

1 回答 1

0

我终于找到了解决这个问题的方法。

公用表表达式 (CTE) 是一个好的开始。我对它所做的唯一更改是在递归定义中——我没有为每个孩子收集直系父母的 id,而是为其分配了祖父母的 id(直系父母的父母 id)。这意味着每个孩子都被分配了最终的父 ID,而不是在层次结构中仅向上移动一步。从那里开始,在报告中使用它非常简单。

我将 CTE 放在自己的存储过程中——唯一的目的是恢复整个层次结构。从那里,我创建了另一个存储过程,它将 CTE 与不同的存储过程结合在一起。这时候,我应用了过滤器并返回了最终的结果集。

于 2011-05-13T21:40:18.973 回答