开篇介绍
除了之前的几篇文章中出现的时间维度,雪花型维度的设计之外还有一种比较特殊的维度 - 父子维度。父子维度特殊就特殊在它包含了一种基于递归关系(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 在层次结构里面,如何不看自己
相关设置如下:
设置前 -
设置后 -