微软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。

微软BI 之SSAS 系列 - 关于父子维度的设计

创建一个 SSAS 项目并创建数据源和数据源视图。

微软BI 之SSAS 系列 - 关于父子维度的设计

新建一个维度,并选择 EmployeeKey 作为 Key Column, FullName 作为 Name Column 来展现标签信息。

微软BI 之SSAS 系列 - 关于父子维度的设计

选择属性,因为 FullName 已经作为 Employee Key 的 Name Column,因此不会在这里显示了。

微软BI 之SSAS 系列 - 关于父子维度的设计

修改一下属性的名字。

微软BI 之SSAS 系列 - 关于父子维度的设计

下一步并给维度取一个名字 Employee 保存之后就能看到这个维度了,并且可以看到 Employees 属性有一个自引用的结构特征。

微软BI 之SSAS 系列 - 关于父子维度的设计

查看 Employee 属性, Usage 是 Key。 在这里一定要注意,父子关系层次结构中的子级必须是维度的关键属性,所以 Employee 这里的 Usage 必须是 Key 。

微软BI 之SSAS 系列 - 关于父子维度的设计

而 Employees 其实就是对应的 ParentEmployeeKey,它的 Usage 必须是 Parent 才能表示这样的一个父子维度。

微软BI 之SSAS 系列 - 关于父子维度的设计

并且要注意的是每一个维度有且只能有一个属性的 Usage 属性能够被设置为 Key。这里别混淆了维度属性和数据库字段(属性),作为维度属性中的 Key 有可能是由数据库中的一个或者多个字段构成的复合主键组成的,这个 Key 在维度属性中只能有一个。

如果是父子维度,那么有且仅有一个属性的 Usage 属性的值被设置为 Parent,所有其它的属性的 Usage 属性的值均为 Regular。

部署并浏览属性层次结构 ,注意到 Employee 属性层次结构并没有显示出来。

微软BI 之SSAS 系列 - 关于父子维度的设计

这是因为在创建父子维度的过程中,它的 AttributeHierarchyVisible 默认被设置成了 False。

微软BI 之SSAS 系列 - 关于父子维度的设计

除此之外,我们还可以修改 Employees 的  MemberWithDataCaption 属性来标记数据成员,以及 Naming Template 来表示不同的级别的属性。IsAggregatable 属性也修改为 False, 这样就不会出现 ALL 这一个级别的成员了。

微软BI 之SSAS 系列 - 关于父子维度的设计

因为没有了 ALL 这个级别的成员,因此可以选择一个成员作为默认成员。

微软BI 之SSAS 系列 - 关于父子维度的设计

再次部署之后就能看到不同的级别上人员信息就有了级别信息了,在这个例子中由于源数据包含了部分历史维度信息,所以能看到两个相同的 David M Bradley 和 Laura F Norman,关于这些历史数据就不在我们的讨论范围之内了。

微软BI 之SSAS 系列 - 关于父子维度的设计

PS:补充一下相关天善论坛里的一个问题 - SSAS 在层次结构里面,如何不看自己

相关设置如下:

微软BI 之SSAS 系列 - 关于父子维度的设计

设置前 -

微软BI 之SSAS 系列 - 关于父子维度的设计

设置后 -

微软BI 之SSAS 系列 - 关于父子维度的设计

更多 BI 文章请参看 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server) 如果觉得这篇文章看了对您有帮助,请帮助推荐,以方便他人在 BIWORK 博客推荐栏中快速看到这些文章。

上一篇:canvas水波纹效果


下一篇:Android 自定义view实现水波纹效果