父子维度的特点是存在自引用,数据存在层次结构,table的schema的特点是存在一个字段和本身存在外键关系,例如员工表 emph(ID,ParentID,。。。。)。
下图是AdventureWorksDW2012中的DimEmployee,语义是一个员工的Leader,也是Employee。
1,创建DimEmployee维度,只创建两个属性
查看Attribute Usage,EmployeeKey是Key,而ParentEmployeeKey是Parent。
2,父子维度会自动把ParentEmployeeKey创建为一个用户自定义的Hierarchy,而不是属性层次结构。
3,增加一个属性title,DimEmployee维度的三个属性的Icon都是不同的,在Browser中,能看到Title层次结构,SSAS为Title创建的Hierarchy是属性层次结构。
4,查看Title的Properties,在Advanced中有三个重要的属性,
AttributeHierarchyEnable:是启用属性Title的属性层次结构,如果设置为False,就不会创建属性层次结构。
AttributeHierarchyVisible:表示属性层次结构是否可见,如果启用属性Title的属性层次结构,但是AttributeHierarchyVisible=false,那么在Borwser中查看不到该属性的属性层次结构。
DefaultMember:默认的成员,如果没有设置DefaultMember,并且IsAggregatable=true,那么系统会自动生成一个All成员,作为Hierarchy的默认成员,如果IsAggregatable=false,那么那么系统不会自动生成一个All成员,系统将Hierarchy的第一个成员作为Hierarchy的默认成员
IsAggregatable:是否是可聚合的。如果是可以聚合的,SSAS会自动生成一个名为All的成员,代表该属性所有值的聚合。如果IsAggregatable=false,那么将使用该属性的第一个值做为查询条件来进行聚合。
5,IsAggregatable 属性的理解
将Title的IsAggregatable设置为Ture,通过borwser查看,存在All成员和All Level。
将Title的IsAggregatable设置为False,通过borwser查看,没有生成All成员和All Level。
5,AttributeHierarchyVisible 属性
在Borwser中看不到EmployeeKey 属性层次结构的原因是AttributeHierarchyVisible=false
6,Value column 显示成员的值,如果不设置,默认值是name Column。
KeyColumns一般被设计为int值,只作为Primary Key,起到唯一标识作用。
NameColumn方便阅读
ValueColumn 是成员的值,能够做特定的运算。
如何理解KeyColumns,NameColumn和ValueColumn?对一行记录有不同的理解,但都是同一行记录,对于int类型,占用存储空间小,容易聚合,适合做primary key,但是不易阅读,char类型的数据,容易阅读,适合作为Name Column,对于一个有具体类型的数据,其value必须能够做一些运算,例如Date类型,能够做Year(),dateadd()等运算,这些可以通过ValueColumn来进行。
示例,一个表Record(ID,Name,Value),有一行数据(1,20150201,1/2/2015)
那么ID=1是keyColumn,Name=20150201是NameColumn,Value=1/2/2015是ValueColumn
7,父子维度特有的属性,这些属性是Attribute Usage=Parent的维度属性特有的。
7.1 属性RootMemberIf
判断一个节点是否为根节点的依据,把属性的值赋成ParentIsBlankSelfOrMissing,表示当一个成员的Parent属性值为空,是自己,或者不存在的时候,这个成员就是根节点。
7.2 MembersWithData 是否在子节点中,显示非叶子节点。
默认值是NonLeafDataVisible,每个节点的子节点清单中都有一个自己。
把MembersWithData属性的值赋成NonLeafDataHidden,就不会显示非叶子节点了。
7.3 MemberWithDataCaption
在某一个非叶子节点下,为该节点增加一个Caption,以区分非叶子节点。
例如,MemberWithDataCaption=Senior_*,* 代表当前成员的值
7.4 NamingTemplate,实际上是Level Naming Template
为非叶子节点的Level定义一个命名模板,第一个Leval命名为All,且不能改变,从Level2开始,默认的是Level +数字。
通过Level Naming Template可以改写Level的命名模板,例如将Level2命名Boss_Level,,,,,