使用Reporting Services設計父子式階層報表

  • 12063
  • 0
  • 2011-04-17

使用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

4_50

父子式階層資料結構

2. 首先加入一個資料表物件,將員工名稱與銷售金額欄位加入此資料表。

3. 建立以「EMPLOYEE_KEY」為基礎的群組,然後把詳細資料刪除。

4_51

設計群組

4. 點選「EMPLOYEE_KEY」群組按右鍵,選取群組屬性,切換至「進階」分頁,在「遞迴父系」處下拉選取「MANAGER_KEY」。

4_52

遞廻父系

5. 此時可以刪除掉系統自動產生的「EMPLOYEE_KEY」資料行,以及將報表稍作排版。

6. 如果我們希望視覺上能夠呈現出如樹狀規則結構,則必須透過縮排的方式來呈現。所以接下來我們要在設定Padding的屬性,在屬性視窗中的「Padding」展開後的「Left」選項內撰寫以下運算式。

=(2 + (Level()*20)) & "pt“

4_53

設定縮排

7. 以上的運算式是使用Level()函數來讀取出這條規則所在的層級位置,然後根據層級所在位置設定留白的大小,以我們這段語法為例,層級一的規則會產生22pt的留白,而層級二會產生42pt (2 + (2*20))的留白,以此類推。就可以做出非常漂亮的自動縮排的效果。

8. 接下來,依照之前介紹的原理,在此父子式維度上加入下鑽功能。也就是將可見性切換為隱藏,並將切換顯示設定為「EMPLOYEE_NAME」。

4_54

設定下鑽

9. 此時即可達成如圖4.55漂亮的父子式階層結構。

4_55

父子式階層報表

10.不過仔細一看有點怪怪的,怎麼比較上層的員工都沒有數字。那是因為比較上層的都是高階主管,高階主管都不會自己出去跑業務,而是下層的業務人員才會有銷售業績數字。但是在管理面上,高階主管要扛的銷售數字就是下面業務人員的數字總和,因此我們的公式可以做以下調整:

加總

=Sum(Fields!SALES_AMT.Value,"EMPLOYEE_KEY")

遞迴累加

=Sum(Fields!SALES_AMT.Value,"EMPLOYEE_KEY",recursive)

11.就可以產生正常的父子式階層報表了。

4_56

遞迴累加後父子式階層

Allan Yiin

CTO, AsiaMiner