微軟BI 之SSAS 系列 - 關於父子維度的設計


除了之前的幾篇文章中出現的時間維度,雪花型維度的設計之外還有一種比較特殊的維度 - 父子維度。父子維度特殊就特殊在它包含了一種基於遞歸關系(Recursive Relationship)的引用結構,  在我的這篇文章中提到了如何基於父子層次結構來設計和制作 SSRS 報表,不過那個報表是基於數據倉庫的。而現在我們要設計的是基於父子結構的維度,在此基礎之上我們也可以設計出基於 SSAS 數據庫的 SSRS 報表。

下面仍然是我們的測試表和數據,測試表包含了一個員工維度表和銷售的事實表。

USE BIWORK_SSIS GO

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

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

SELECT EmployeeKey, ParentEmployeeKey, EmployeeNationalIDAlternateKey, CASE WHEN ISNULL(MiddleName,'') = ''  THEN FirstName +' '+ LastName ELSE FirstName +' '+ MiddleName +' '+LastName END AS FullName, Title INTO DimEmployee FROM AdventureWorksDW2012.dbo.DimEmployee

SELECT ProductKey, OrderDateKey, EmployeeKey, SalesOrderLineNumber, SalesOrderNumber, UnitPrice, ProductStandardCost, SalesAmount INTO FactResellerSales FROM AdventureWorksDW2012.dbo.FactResellerSales GO

ALTER TABLE DimEmployee ADD CONSTRAINT PK_EmployeeKey PRIMARY KEY CLUSTERED (EmployeeKey) GO

ALTER TABLE DimEmployee ADD CONSTRAINT FK_ParentEmployeeKey FOREIGN KEY(ParentEmployeeKey) REFERENCES DimEmployee(EmployeeKey) GO

ALTER TABLE FactResellerSales ADD CONSTRAINT PK_Reseller_OrderLineNumber_OrderNumber PRIMARY KEY CLUSTERED (SalesOrderLineNumber,SalesOrderNumber) GO

ALTER TABLE FactResellerSales ADD CONSTRAINT FK_EmployeeKey FOREIGN KEY(EmployeeKey) REFERENCES DimEmployee(EmployeeKey) GO

SELECT * FROM DimEmployee SELECT * FROM FactResellerSales

員工表中的 ParentEmployeeKey 指向了自身的主鍵 EmployeeKey,而 FactResellerSales 中的主鍵是由 SalesOrderLineNumber 和 SalesOrderNumber 構成的一個復合主鍵,並且 EmployeeKey  指向了 DimEmployee 的 EmployeeKey。

創建一個 SSAS 項目並創建數據源和數據源視圖。

新建一個維度,並選擇 EmployeeKey 作為 Key Column, FullName 作為 Name Column 來展現標簽信息。

選擇屬性,因為 FullName 已經作為 Employee Key 的 Name Column,因此不會在這里顯示了。

修改一下屬性的名字。

下一步並給維度取一個名字 Employee 保存之后就能看到這個維度了,並且可以看到 Employees 屬性有一個自引用的結構特征。

查看 Employee 屬性, Usage 是 Key。 在這里一定要注意,父子關系層次結構中的子級必須是維度的關鍵屬性,所以 Employee 這里的 Usage 必須是 Key 。

 

而 Employees 其實就是對應的 ParentEmployeeKey,它的 Usage 必須是 Parent 才能表示這樣的一個父子維度。

並且要注意的是每一個維度有且只能有一個屬性的 Usage 屬性能夠被設置為 Key。這里別混淆了維度屬性和數據庫字段(屬性),作為維度屬性中的 Key 有可能是由數據庫中的一個或者多個字段構成的復合主鍵組成的,這個 Key 在維度屬性中只能有一個。

如果是父子維度,那么有且僅有一個屬性的 Usage 屬性的值被設置為 Parent,所有其它的屬性的 Usage 屬性的值均為 Regular。

部署並瀏覽屬性層次結構 ,注意到 Employee 屬性層次結構並沒有顯示出來。

這是因為在創建父子維度的過程中,它的 AttributeHierarchyVisible 默認被設置成了 False。

除此之外,我們還可以修改 Employees 的  MemberWithDataCaption 屬性來標記數據成員,以及 Naming Template 來表示不同的級別的屬性。IsAggregatable 屬性也修改為 False, 這樣就不會出現 ALL 這一個級別的成員了。

因為沒有了 ALL 這個級別的成員,因此可以選擇一個成員作為默認成員。

再次部署之后就能看到不同的級別上人員信息就有了級別信息了,在這個例子中由於源數據包含了部分歷史維度信息,所以能看到兩個相同的 David M Bradley 和 Laura F Norman,關於這些歷史數據就不在我們的討論范圍之內了。

 

PS:補充一下相關天善論壇里的一個問題 - SSAS 在層次結構里面,如何不看自己

相關設置如下:

設置前 -

設置后 -

更多 BI 文章請參看 BI 系列隨筆列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果覺得這篇文章看了對您有幫助,請幫助推薦,以方便他人在 BIWORK 博客推薦欄中快速看到這些文章。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM