使用Reporting Services設計父子式階層報表
在多維度分析中,父子式維度是非常重要的維度結構之一。它可以用最精簡的資料結構來處理層數過多、層數不對稱以及層數不確定的階層結構。像是組織架構、會計科目或是製造業的物料表(BOM)都屬於父子式階層。以下我們將示範如何利用SSRS設計父子式階層報表。
1. 首先父子式階層一定需要符合以下原則。在資料表中,除了成員的鍵值之外,還要有另外一個欄位用來表示父層成員的鍵值,以「範例語法:父子式階層報表」為例
SELECT
EMPLOYEE_KEY,
MANAGER_KEY,
EMPLOYEE_NAME,
SUM(C.SALES_AMT) AS SALES_AMT
FROM dbo.DIM_EMPLOYEE A
LEFT JOIN
dbo.DIM_STORE B
ON A.EMPLOYEE_KEY=B.MANAGER_EMPLOYEE_KEY
LEFT JOIN
dbo.FACT_SALES C
ON B.STORE_KEY=C.STORE_KEY AND YEAR(TRX_DTE)=2009
GROUP BY
EMPLOYEE_KEY,
MANAGER_KEY,
EMPLOYEE_NAME
父子式階層資料結構
2. 首先加入一個資料表物件,將員工名稱與銷售金額欄位加入此資料表。
3. 建立以「EMPLOYEE_KEY」為基礎的群組,然後把詳細資料刪除。
設計群組
4. 點選「EMPLOYEE_KEY」群組按右鍵,選取群組屬性,切換至「進階」分頁,在「遞迴父系」處下拉選取「MANAGER_KEY」。
遞廻父系
5. 此時可以刪除掉系統自動產生的「EMPLOYEE_KEY」資料行,以及將報表稍作排版。
6. 如果我們希望視覺上能夠呈現出如樹狀規則結構,則必須透過縮排的方式來呈現。所以接下來我們要在設定Padding的屬性,在屬性視窗中的「Padding」展開後的「Left」選項內撰寫以下運算式。
=(2 + (Level()*20)) & "pt“
設定縮排
7. 以上的運算式是使用Level()函數來讀取出這條規則所在的層級位置,然後根據層級所在位置設定留白的大小,以我們這段語法為例,層級一的規則會產生22pt的留白,而層級二會產生42pt (2 + (2*20))的留白,以此類推。就可以做出非常漂亮的自動縮排的效果。
8. 接下來,依照之前介紹的原理,在此父子式維度上加入下鑽功能。也就是將可見性切換為隱藏,並將切換顯示設定為「EMPLOYEE_NAME」。
設定下鑽
9. 此時即可達成如圖4.55漂亮的父子式階層結構。
父子式階層報表
10.不過仔細一看有點怪怪的,怎麼比較上層的員工都沒有數字。那是因為比較上層的都是高階主管,高階主管都不會自己出去跑業務,而是下層的業務人員才會有銷售業績數字。但是在管理面上,高階主管要扛的銷售數字就是下面業務人員的數字總和,因此我們的公式可以做以下調整:
加總
=Sum(Fields!SALES_AMT.Value,"EMPLOYEE_KEY")
遞迴累加
=Sum(Fields!SALES_AMT.Value,"EMPLOYEE_KEY",recursive)
11.就可以產生正常的父子式階層報表了。
遞迴累加後父子式階層
Allan Yiin
CTO, AsiaMiner