1

我正在构建SSRS报告,并且在解决如何实现SSRS报告时遇到了一些问题。分层SQL查询,SSRS 2008和求和列

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

  • 1A级
    • 2A级
    • 等级2b中
    • 等级2C
      • 3A级
  • 1b级
  • 等级1C

在数据库中,每一级具有一个ID和一个父id其中在根的所有父IDS(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

我终于找到了这个解决方案。

公共表格表达式(CTE)是一个好的开始。我对它做的唯一改变是在递归定义中 - 我没有为每个孩子收集直接父对象的ID,而是将它分配给了祖父母的ID(即父对象的父ID)。这意味着每个孩子都被分配了最终的父母身份证,而不是在层次结构中只移动一个步骤。从那里开始,在报告中使用它非常简单。

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