MDX中基于IIF/CurrentMember条件的自定义度量聚合问题
MDX:带动态权重的自定义聚合度量实现
问题描述
我是MDX新手,需要定义一个带IIF条件的自定义聚合度量,现有数据模型如下:
| Category | Name | ItemType | Price |
|---|---|---|---|
| CatA | Item1 | Normal | 4.0 |
| CatA | Item2 | Precious | 5.0 |
初始写的度量逻辑是:ItemType为Precious时,Price乘以2,否则用原Price,代码如下:
WITH Member [Measures].[WeightedMeasure] AS IIF( [ItemType].CurrentMember IS [ItemType].[Precious], 2 * [Measures].[Price], [Measures].[Price] )
但这个度量只有在叶子层级(维度包含ItemType)时计算正确,按Category聚合时,因为当前成员不是叶子节点,IIF条件无法匹配,导致聚合结果错误。
另外有两个限制:
- 权重(示例中的2)是动态的,不能预先在数据源中添加缩放后的Price列
- 必须将该逻辑作为度量而非临时查询计算,方便后续用于
TopCount等操作(比如展示最昂贵的类别)
我试过调整IIF条件匹配后代节点、用SCOPED/过滤查询,但都没搞定,也查过类似问题但无法满足需求。
解决方案
核心是基于叶子节点的逐行判断再聚合,而非依赖当前层级的成员属性。用SUM结合DESCENDANTS遍历所有ItemType叶子节点,逐个计算加权值后汇总:
最终度量代码
WITH Member [Measures].[WeightedMeasure] AS SUM( -- 获取当前节点下所有ItemType的叶子成员 DESCENDANTS([ItemType].CurrentMember, [ItemType].[ItemType]), -- 对每个叶子节点执行加权判断 IIF( [ItemType].CurrentMember IS [ItemType].[Precious], 2 * [Measures].[Price], [Measures].[Price] ) )
关键说明
- DESCENDANTS:确保无论当前聚合到哪个层级(比如Category),都会遍历其下所有具体的ItemType叶子成员,每个成员单独判断类型
- SUM聚合:将每个叶子节点的加权值累加,得到正确的聚合结果
- 动态权重支持:直接修改IIF中的乘数即可调整权重,完全无需修改数据源
TopCount使用示例
如果要筛选最昂贵的类别,直接用这个度量就行:
SELECT [Measures].[WeightedMeasure] ON COLUMNS, TopCount([Category].[Category].Members, 1, [Measures].[WeightedMeasure]) ON ROWS FROM [YourCube]
内容的提问来源于stack exchange,提问作者Ilya
相关产品推荐
相关产品推荐

