如何在SSAS中将MDX维度成员作为度量值展示
解决MDX透视表添加各层级项目状态度量的方案
刚接触MDX就能用到Scope和层次结构,已经很不错啦!针对你要给每个层级(Feature_Parent、Feature、User Story)添加状态度量列的需求,我分两种常见场景给你提供解决方案:
场景1:状态是维度属性(存储在维度表中)
如果你的项目状态是维度层级成员的属性(比如每个Feature_Parent、Feature、User Story在维度里都有对应的Status属性),可以通过创建计算度量来提取每个层级的状态值:
WITH -- 提取Feature Parent层级的状态 MEMBER [Measures].[Feature Parent Status] AS IIF( NOT IsEmpty([Project Hierarchy].[Feature Parent].CurrentMember), [Project Hierarchy].[Feature Parent].CurrentMember.Properties("Status"), NULL ) -- 提取Feature层级的状态 MEMBER [Measures].[Feature Status] AS IIF( NOT IsEmpty([Project Hierarchy].[Feature].CurrentMember), [Project Hierarchy].[Feature].CurrentMember.Properties("Status"), NULL ) -- 提取User Story层级的状态 MEMBER [Measures].[User Story Status] AS IIF( NOT IsEmpty([Project Hierarchy].[User Story].CurrentMember), [Project Hierarchy].[User Story].CurrentMember.Properties("Status"), NULL ) SELECT -- 将状态度量和你原有的数值度量一起放在列轴 { [Measures].[Feature Parent Status], [Measures].[Feature Status], [Measures].[User Story Status], [Measures].[Your Existing Numeric Measure] -- 替换成你已有的数值度量 } ON COLUMNS, -- 行轴用你的层次结构成员 NON EMPTY [Project Hierarchy].[Full Hierarchy].Members ON ROWS FROM [Your Cube Name] -- 替换成你的立方体名称
关键说明:
- 把
[Project Hierarchy]换成你实际的维度名称,[Full Hierarchy]换成你创建的用户层次结构名称。 Properties("Status")里的Status要和维度属性的名称完全一致(可以在SSAS维度设计器里查看属性的“名称”字段)。- 用
IIF判断当前成员是否为空,避免在高层级显示无意义的状态值。
场景2:状态是事实表中的度量(需聚合父层级状态)
如果状态是事实表中的字段(比如每个User Story有单独的状态记录,父层级的状态需要通过子项聚合得到),你需要用Scope语句定义聚合逻辑,比如:
-- 先创建基础状态度量(从事实表取User Story的状态) WITH MEMBER [Measures].[User Story Status] AS [Measures].[Status From Fact Table] -- 定义Feature层级的状态聚合逻辑(示例:子项全完成则父项完成,否则进行中) MEMBER [Measures].[Feature Status] AS NULL -- 定义Feature Parent层级的状态聚合逻辑 MEMBER [Measures].[Feature Parent Status] AS NULL SELECT { [Measures].[Feature Parent Status], [Measures].[Feature Status], [Measures].[User Story Status], [Measures].[Your Existing Numeric Measure] } ON COLUMNS, NON EMPTY [Project Hierarchy].[Full Hierarchy].Members ON ROWS FROM [Your Cube Name] -- 用Scope设置父层级的状态计算逻辑 SCOPE ([Project Hierarchy].[Feature].Members, [Measures].[Feature Status]); THIS = CASE -- 统计未完成的子User Story数量,为0则标记完成 WHEN Count(Filter([Project Hierarchy].[User Story].CurrentMember.Children, [Measures].[User Story Status] <> "Completed")) = 0 THEN "Completed" ELSE "In Progress" END; END SCOPE; SCOPE ([Project Hierarchy].[Feature Parent].Members, [Measures].[Feature Parent Status]); THIS = CASE WHEN Count(Filter([Project Hierarchy].[Feature].CurrentMember.Children, [Measures].[Feature Status] <> "Completed")) = 0 THEN "Completed" ELSE "In Progress" END; END SCOPE;
自定义聚合逻辑提示:
如果你的状态有优先级(比如用数值映射:1=待办,2=进行中,3=完成),可以用Max或Min来聚合,比如:
THIS = Max([Project Hierarchy].[Feature].CurrentMember.Children, [Measures].[Status Numeric Value])
然后再把数值转成对应的状态文本即可。
和你现有Scope透视表结合
如果已经有基于Scope的透视表,只需要把上面的计算度量加入到SELECT的列轴集合中,或者把Scope语句合并到你现有的MDX脚本里就行。
内容的提问来源于stack exchange,提问作者Lena Meer
相关产品推荐
相关产品推荐

