分层SQL查询,SSRS 2008和求和列

时间:2011-03-31 21:19:01

标签: ssrs-2008 hierarchical-data common-table-expression drilldown

我正在构建SSRS报告,并且在确定如何实现它时遇到了一些麻烦。

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

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

在数据库中,每个级别都有一个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似乎很有用,但我无法得到它上班)。

不能更改数据库架构。

有没有人知道我可以用来开始的任何好资源,或者对如何继续这个有任何想法?

如果我错过任何东西,请告诉我......

1 个答案:

答案 0 :(得分:0)

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

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

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