【TechTarget中国原创】使用Analysis Services MDX语句,可以很容易地实现像这种具有父子维关系类型的层次结构。
您并不需要为了创建父子维而修改相关的数据表。很简单,只要顺着维度创建向导操作就可以了;跟设计其他普通维度可以说是非常的相似。只要在相关的维度当中指定主键和外键约束,向导就会自动发现其递归关联。也可以选择在数据源的视图或数据表当中定义自联接的逻辑关系。
在我们的示例里面 ,列“ReportsTo”与列“EmployeeID”相关联;一旦已经创建了一个父子维,就要将层级属性当中的MembersWithData属性的值赋成NonLeafDataHidden。MembersWithData 元素的值仅供父属性使用,以确定是否显示父属性中非叶数据成员(非叶成员表示在父子维中不在最底层的数据成员)。默认情况下,父子层级的名称与维表的名字相同,为了更为清晰的表达,我把示例中的父子层级重命名为“org_chart”。
一旦对维度进行处理以后,员工的名字就将在员工维度层级数据中被展现出来。
如(图1):

图1为在Analysis Services MDX中处理了维度之后,组织结构层级显示的结果。
如果将MembersWithData属性的默认值改为了“NonLeafDataVisible”,那么您就会发现Andrew的下面还有一个Andrew,Janet的下面还有一个Janet如此等等。事实上,如果您想查看Andrew的订单,而不需要把他的下属的订单附加到他的总数里面,这种情况可以把MembersWithData属性的值赋成“NonLeafDataVisible”。
现在让我们使用MDX,执行一个简单的查询来得到从Steven开始的组织结构; 查询语句如下:
SELECT ASCENDANTS(employees.org_chart.steven) ON 0, {measures.[orders count]} ON 1 FROM [cube name] |
查询结果:

同样的,要想得到Janet下面所有员工的订单数量,可以通过如下的MDX查询语句来得到:
SELECT DESCENDANTS(employees.org_chart.Janet) ON 0, {measures.[orders count]} ON 1 FROM [cube name] |
查询结果:

如果您想查看Janet个人的销售情况,而不包含她下属员工的销售情况,应该怎么做呢? 可以采用属性层次结构结合维度关键字,来代替父子层次结构。
查询语句如下:
SELECT employees.employees.Janet ON 0, {measures.[orders count]} ON 1 FROM [cube name] |
查询结果:

如果选择父子维层次结构,在使用父子维层级查询的时候只要在Janet的后面加上“DataMember”函数就可以得到跟上面相同的结果。查询语句如下:
SELECT employees.org_chart.Janet.DataMember ON 0, {measures.[orders count]} ON 1 FROM [cube name] |
父子维可以控制任何数量的层级关系,即使只定义一个单一层级也是可以的。与SQL Server不同,并不需要为了查询组织机构中的某个指定的成员而不得不增加不定数目的关联查询。
通过在父子层级中设置“RootMemberIF”属性来确定成员是否显示在顶级层级;在本文前面的例子当中已经可以看到Andrew显示在了顶级层级当中,因为他所对应的“ReportsTo”的列值不存在。让我们看看如果把Margaret对应的“EmployeeID“和”ReportsTo“的列值都改成同一个值,都让它们等于4,会有什么样的结果;现在Margaret和Andrew已经全都显示在了整个层次结构的顶层;如图2所示:

图2为将“EmployeeID“和”Reports_To”的值都改为4的结果。
RootMemberIF属性的默认值为“ParentIsBlankSelforMissing”。“ParentIsBlankSelforMissing”的意思表示当“ReportsTo”列的值不存在或者为空,或者当“EmplyeeID”和“ReportsTo”列的值相同的时候就会将其提升到整个层次结构的顶级层级。
根据具体需求也可以将RootMemberIF的属性值指定为“ParentIsBlank”,“ParentIsMissing”,“ParentIsSelf”。
在父子层级当中另一个值得注意的属性是“NamingTemplate”。
在一个常规的层级当中,对于每一个层级的命名都是根据其对应的属性来进行的;
例如:在一个日期层次结构当中,可以把各个层级的名字指定为“年份”,“季度”,“月份”等等。
由于只为父子层次结构定义了一个单独的属性,因此无法够根据属性的名字来为不同的层级进行命名。
正因为如此,系统为各个层级分配了一个序号以做区分。默认的,各个层级将被命名为:“Level 01”,“Level 02”,“Level 03”等等。
为了能够对各个层级进行更好的描述,父子层次结构当中提供了“命名模板”以修改默认的命名。例如:按照销售的具体场景我们可以把各个层级命名为:“Salesperson01”,“Salesperson02”,等等。想要实现这样的效果只需要将“NamingTemplate”属性值设置为“Salesperson *”。