微軟BI 之SSRS 系列 - 使用分組 Group 屬性實現基於父子遞歸關係的彙總報表

基於父子關係的遞歸結構在公司組織結構裏比較常見,基本上都是在一張表裏實現的自引用關係。在報表中若是要實現這種效果,而且在這個基礎上作一些數據的彙總,可使用到下面提到的方法。html

要實現的效果大體以下 -web

半收起的效果 -函數

從 AdventureWorks2012 中抽取一些示例數據 -spa

USE BIWORK_SSIS GO

IF OBJECT_ID('DimEmployee','U') IS NOT NULL
DROP TABLE DimEmployee GO 

IF OBJECT_ID('FactResellerSales','U') IS NOT NULL
DROP TABLE FactResellerSales GO 

SELECT EmployeeKey, ParentEmployeeKey, EmployeeNationalIDAlternateKey, FirstName + ' '+ LastName AS FullName, Title INTO DimEmployee FROM AdventureWorksDW2012.dbo.DimEmployee SELECT ProductKey, OrderDateKey, EmployeeKey, SalesOrderLineNumber, SalesOrderNumber, UnitPrice, ProductStandardCost, SalesAmount INTO FactResellerSales FROM AdventureWorksDW2012.dbo.FactResellerSales

咱們能夠作一個簡單的 CTE 遞歸查詢,能夠看到這些 Employee 的級別 Level 3d

WITH Employees AS ( SELECT EmployeeKey, ParentEmployeeKey, FullName, Title, 1 AS EmployeeLevel FROM DimEmployee WHERE ParentEmployeeKey IS NULL
    UNION ALL
    SELECT e.EmployeeKey, e.ParentEmployeeKey, e.FullName, e.Title, es.EmployeeLevel + 1 AS EmployeeLevel FROM DimEmployee AS e INNER JOIN Employees AS es ON es.EmployeeKey = e.ParentEmployeeKey ) SELECT *
FROM Employees ORDER BY EmployeeLevel,FullName

這是咱們經過 SQL 查詢的方式實現級別的判斷,能夠看到它們的級別,那麼這種級別也應該能反映到報表中。orm

固然在報表中不須要這麼複雜的查詢語句,報表中的 Dataset 只須要提供正確的父子鍵,也就是上面看到的 EmployeeKey 和 ParentEmployeeKey 便可。在報表中只須要簡單的設置就能夠實現這種父子遞歸彙總的效果,新建一個報表並建立好數據源,使用下面查詢建立一個 Dataset - DS_ParentChild。htm

SELECT es.*, fact.SalesOrderNumber, fact.UnitPrice, fact.SalesAmount FROM DimEmployee AS es LEFT JOIN FactResellerSales as fact ON es.EmployeeKey = fact.EmployeeKey

拖放一個 Table 並填寫幾個基本的字段 -對象

 選擇 Group Properties 並注意這裏的 Group 名稱就叫作 Details。blog

基本行是按照 EmployeeKey 分組的。排序

這裏選擇遞歸的父對象是 ParentEmployeeKey 指向父級成員。

最後能夠設置按照 FullName 的點擊來完成收縮或者展開效果。

保存並預覽報表,已經有一個雛形了。可是還有兩個問題須要解決:第一個就是 Sales Amount 的聚合,這裏和以往有所區別。第二個就是層次結構的縮進問題,之前的層次結構是固定的,因此咱們能夠手動敲空格,可是此次碰到的是一個不固定的層次結構。

在 Sales Amount 裏添加表達式,注意這裏的 Details 是上面 Group 的名稱,有不少人效果出不來是由於習慣性的將這裏寫成了 Dataset 的名稱 DS_ParentChild。

 =SUM(Fields!SalesAmount.Value,"Details",Recursive)

縮進的問題,能夠經過在 FullName 的Padding屬性中經過 Level() 內置函數來定義左邊的 Padding 間距: =CStr(2 + (Level()*20)) + "pt"。有興趣的話,能夠直接使用 Level() 內置函數看看它在 Group 中的級別。

固然也可使用這個 Level() 來控制 Sales Amount 的縮進,而且應該在Group Properties 裏面設置一下 Sort 排序,能夠按照 Full Name 來排序,最後保存美化以後的效果就是這樣的。

下次再來看在 Cube 中經過 MDX 查詢來實現這種父子遞歸效果。

 


更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)

若是以爲這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。

相關文章
相關標籤/搜索