MDX查询后续问题:将行维度替换为Dim1(基于命名集切片)
解决MDX中行维度从ID替换为Dim1的问题
你好!我明白你是想把原MDX查询的行维度从[ID]换成[Dim1]但遇到了问题,咱们先拆解原查询的逻辑,再一步步调整成适配[Dim1]的版本。
原查询的核心是NewIDs这个集合:它通过INTERSECT取两个NonEmpty结果的交集,筛选出同时在[Date].&[T-1],[Category].&[Old]和[Date].&[T],[Category].&[EOD]这两个组合下有数据的[ID]成员。要换成[Dim1],我们需要把集合定义里的维度对象替换,同时保持筛选逻辑的合理性。
修改后的MDX代码
WITH SET NewDim1s AS INTERSECT( NonEmpty([Dim1].Children, CROSSJOIN([Date].&[T-1], [Category].&[Old])), NonEmpty([Dim1].Children, CROSSJOIN([Date].&[T], [Category].&[EOD])) ) SELECT NON EMPTY([Dim2].Children ) ON 0, NON EMPTY(NewDim1s ) ON 1 FROM [MyCube] WHERE [Measures].[Value]
关键调整点
- 把原集合
NewIDs重命名为NewDim1s(只是语义化优化,不影响功能) - 将两处
[ID].Children替换为[Dim1].Children,确保我们筛选的是Dim1维度的子成员 - 保留
INTERSECT和NonEmpty的核心逻辑,依然筛选在两个日期-分类组合下都有数据的Dim1成员 - 行轴上直接使用新定义的
NewDim1s集合
特殊场景处理(如果Dim1是ID的上级维度)
如果Dim1和ID存在层级关系(比如Dim1是ID的父级维度),上面的直接替换可能无法准确关联到有数据的ID对应的Dim1成员,这时候可以用EXISTS来关联层级:
WITH SET NewDim1s AS INTERSECT( NonEmpty([Dim1].Children, EXISTS([ID].Children, CROSSJOIN([Date].&[T-1], [Category].&[Old]))), NonEmpty([Dim1].Children, EXISTS([ID].Children, CROSSJOIN([Date].&[T], [Category].&[EOD]))) ) SELECT NON EMPTY([Dim2].Children ) ON 0, NON EMPTY(NewDim1s ) ON 1 FROM [MyCube] WHERE [Measures].[Value]
这个版本会先找到符合条件的ID成员,再关联到对应的Dim1父成员,适合层级维度的场景。
内容的提问来源于stack exchange,提问作者hulked
相关产品推荐
相关产品推荐

