如何将两个针对BI_CUBE的MDX查询通过UNION ALL合并为单查询?
MDX合并查询解决方案
要将两个查询合并为单个MDX查询,核心是利用MDX的Union函数(对应SQL的UNION ALL),同时保证两个行集的结构完全一致(每个Tuple的维度数量、顺序相同)。以下是实现代码:
SELECT { [Measures].[P Count] } ON COLUMNS, Union( -- 第一个子查询对应的行集:保留Imp X为True的成员,Imp Y取默认成员 Crossjoin( [Dim P View].[Person Key].[Person Key].ALLMEMBERS, [Dim P View].[Is Sensitive Data A].[Is Sensitive Data A].ALLMEMBERS, [Dim P View].[Is Sensitive Data B].[Is Sensitive Data B].ALLMEMBERS, { [Dim P View].[Is Person Imp X].&[True] }, { [Dim P View].[Is Person Imp Y].[Is Person Imp Y].DefaultMember } ), -- 第二个子查询对应的行集:保留Imp Y为True的成员,Imp X取默认成员 Crossjoin( [Dim P View].[Person Key].[Person Key].ALLMEMBERS, [Dim P View].[Is Sensitive Data A].[Is Sensitive Data A].ALLMEMBERS, [Dim P View].[Is Sensitive Data B].[Is Sensitive Data B].ALLMEMBERS, { [Dim P View].[Is Person Imp X].[Is Person Imp X].DefaultMember }, { [Dim P View].[Is Person Imp Y].&[True] } ) ) DIMENSION PROPERTIES MEMBER_CAPTION, MEMBER_UNIQUE_NAME ON ROWS FROM [BI_CUBE] WHERE ( -- 筛选Imp X为True 或 Imp Y为True的记录 Filter( Crossjoin( [Dim P View].[Is Person Imp X].[Is Person Imp X].MEMBERS, [Dim P View].[Is Person Imp Y].[Is Person Imp Y].MEMBERS ), [Dim P View].[Is Person Imp X].CurrentMember IS [Dim P View].[Is Person Imp X].&[True] OR [Dim P View].[Is Person Imp Y].CurrentMember IS [Dim P View].[Is Person Imp Y].&[True] ) )
关键说明:
- 结构一致性:两个行集都扩展为包含5个维度的Tuple,其中未筛选的属性取默认成员(如All成员),确保
Union函数可以正常合并。 - 筛选逻辑:通过
Filter实现原两个查询的OR条件,只返回Is Person Imp X为True或Is Person Imp Y为True的记录。 - 贴近原逻辑:直接指定筛选后的目标成员(
&[True]),避免返回不必要的空成员组合。
如果需要过滤无数据的空行,可以在每个Crossjoin外层包裹NonEmpty函数:
NonEmpty( Crossjoin(...), { [Measures].[P Count] } )
内容的提问来源于stack exchange,提问作者bishch
相关产品推荐
相关产品推荐

