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

浏览: 3597

开篇介绍

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

相关设置如下:

设置前 -

设置后 -


推荐 1
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

2 个评论

'ragged hierarchy'好像是个难点,follow了这个tutorial, 还有个疑问:
做好之后,browse, uses Employee name, title and reseller sales amount, 结果发现总经理 ken J Shanchez的title是他所有下属的title的总和。
不知道如何设置才能够避免这个情况。
谢谢分享。
急切盼望博主支持。这里有个关于父子维度的问题,我有个部门表,有部门Id,与父部门Id,可以形成父子维度。但我还有一张表是雇员,雇员的部门Id外键到部门表的部门Id,我现在想通过部门浏览到子部门,然后一直浏览到雇员。因为部门已经是父子维度,如果要浏览到雇员,就必须还要有层次结构,我还没有建立层次结构,只是将雇员ID添加到属性,进行部署和运行时就会报无法访问连接操作的雇员表。向这种既有父子维度,下级还有一层其他表的,应该如何设计才能达到部门一级一级浏览,一直到雇员信息?

要回复文章请先登录注册