Excel中CubeSet的Except()结果引用CubeValue时返回空值的问题
MDX Except集合传入CubeValue返回空值的问题分析与解决方法
问题原因
元组粒度不匹配
你的排除逻辑中,使用[Table2].[Dim2].Members(包含维度的All成员)与[Table1].[Dim1].&[Oranges]/[Pears]组合,但叉乘的集合是[Table2].[Dim2].Children(仅子成员)。Except函数对元组的匹配是严格的,这会导致部分排除的元组实际不在叉乘集合内,同时Excel的CubeValue函数在处理粒度不一致的集合时,可能无法正确解析聚合逻辑,返回空值。Excel Cube函数的集合解析限制
CubeSet返回的集合若包含大量元组,或者元组存在层级不统一的情况,CubeValue可能无法正确执行聚合计算。即使集合在Cube中有效,Excel的Cube函数对复杂集合的兼容性有限,尤其是Except生成的无序集合,容易出现解析异常。
替代实现方法
方法1:统一元组粒度,修正Except逻辑
将排除逻辑中的[Table2].[Dim2].Members替换为[Table2].[Dim2].Children,确保排除的元组与叉乘集合的层级完全一致,让Except的匹配更精准:
Except( {([Table1].[Dim1].Children * [Table2].[Dim2].Children)}, { ([Table1].[Dim1].&[Apples],[Table2].[Dim2].&[Grocery]), ([Table1].[Dim1].&[Oranges],[Table2].[Dim2].Children), ([Table1].[Dim1].&[Pears],[Table2].[Dim2].Children) } )
方法2:用Filter函数替代Except,逻辑更可控
Filter函数通过遍历集合并自定义条件过滤,比Except更直观,也更容易排查元组匹配问题:
Filter( [Table1].[Dim1].Children * [Table2].[Dim2].Children, NOT ( ([Table1].[Dim1].CurrentMember IS [Table1].[Dim1].&[Apples] AND [Table2].[Dim2].CurrentMember IS [Table2].[Dim2].&[Grocery]) OR [Table1].[Dim1].CurrentMember IS [Table1].[Dim1].&[Oranges] OR [Table1].[Dim1].CurrentMember IS [Table1].[Dim1].&[Pears] ) )
方法3:在Cube中定义计算集合
如果有权限修改Cube,可以直接创建计算集合,让Excel调用时更稳定:
WITH SET [Other All] AS Filter( [Table1].[Dim1].Children * [Table2].[Dim2].Children, NOT ( ([Table1].[Dim1].CurrentMember IS [Table1].[Dim1].&[Apples] AND [Table2].[Dim2].CurrentMember IS [Table2].[Dim2].&[Grocery]) OR [Table1].[Dim1].CurrentMember IS [Table1].[Dim1].&[Oranges] OR [Table1].[Dim1].CurrentMember IS [Table1].[Dim1].&[Pears] ) ) SELECT [Measures].[YourMeasure] ON 0, [Other All] ON 1 FROM [YourCube]
之后在Excel中通过CubeSet引用这个[Other All]集合,再传入CubeValue即可。
方法4:分步验证拆分逻辑
先单独验证基础集合的有效性,再逐步加入排除条件,定位问题点:
- 测试叉乘集合的CubeValue是否有数据:
=CubeValue("YourCube", CubeSet("YourCube", "[Table1].[Dim1].Children*[Table2].[Dim2].Children"), "[Measures].[YourMeasure]") - 先排除单个元组,验证集合是否正常返回数据,再逐步加入Oranges和Pears的排除逻辑。
内容的提问来源于stack exchange,提问作者Luke_0
相关产品推荐
相关产品推荐

