之前我寫了一篇在 SSRS 開發中處理這種父子關系的匯總與聚合的文章 (SSRS 系列 - 使用分組 Group 屬性實現基於父子遞歸關系的匯總報表),示例中的查詢是基於 SQL Server 關系型數據庫的,這一篇是基於 MDX 父子維度的 SSRS 報表。
沿用上一篇中的 (SSAS系列 - 關於父子維度的設計)父子維度 和(SSAS 系列 - 自定義的日期維度設計) 的時間維度,並在此基礎上創建 Cube 並部署。
當然在這個例子中可能不會使用到時間維度,之所以添加進來只是因為在 Cube 的創建過程中 SSDT 開發工具會提示:不要創建只含有一個維度的多維數據集。
部署完成之后,我們可以通過 MDX 查看一下相應的維度和度量值數據。
SELECT ([Measures].[Sales Amount]) ON COLUMNS,
NON EMPTY([Employee].[Employees].Members) ON ROWS
FROM [BIWORK_ParentChildDemo]
但是像這樣顯然不夠,因為我們不僅僅需要知道我們應該查詢的不光是當前成員,而且應該展現當前成員的后代子成員。
並且通過 Dimension 屬性來定義要獲取到這些成員的 MEMBER_CAPTION (在父子維度設計的那篇文章已經提到了), 成員的唯一名稱 MEMBER_UNIQUE_NAME,父成員的唯一名稱 PARENT_UNIQUE_NAME, 層次結構中的級別 LEVEL_NUMBER。
SELECT NON EMPTY { [Measures].[Sales Amount]} ON COLUMNS,
NON EMPTY {
(
DESCENDANTS(
[Employee].[Employees].ALLMEMBERS
)
)
}
DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME, PARENT_UNIQUE_NAME,
LEVEL_NUMBER ON ROWS
FROM [BIWORK_ParentChildDemo]
每一個成員的后代子成員都會被查詢出來,這里只展現部分數據。
如何創建報表和連接 SSAS 分析服務數據庫,以及如何創建基於 SSAS MDX 查詢的 Dataset 在這里就不再說了,可以參考我的這篇文章。
設計好報表並拖放好一個 Table 組件,指定好 Employees 和 Sales Amount 列。
選中 Employees 這一行,右鍵編輯 Group 屬性。
在這里注意分組的屬性並不是 Employees 而是它的維度屬性 Employees.UniqueName 。
遞歸父類也是使用的維度屬性 Employees.ParentUniqueName 。
可以根據名字或者 Sales Amount 排序,這里選擇的是 Employees 。
設置顯示和隱藏是根據點擊 Employees 決定的。
設置 Employees 名稱的 Textbox 屬性,根據級別高低來決定左邊距的縮進距離。
=Cstr(Level() * 20) & "pt"
為了顯示不同的級別的背景,也可以手動的設置行背景,粗略的設置了一下顏色,實際開發中可以精心設置。
=Switch(LEVEL()=0,"LightSlateGray",LEVEL()=1,"LightSteelBlue",LEVEL()=2,"LightBlue",LEVEL()=3,"LightCyan",LEVEL()=4,"Azure",LEVEL()=5,"White")
保存並預覽報表的效果,雖然是基於 Cube 的 MDX 查詢,但是實現起來也比較容易。
可以對比一下之前通過數據倉庫直接查詢的父子遞歸實現的 SSRS 報表,數據上都是正確的。
更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server)
如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。