Power BI导入数据:MDX筛选报错及交叉连接空值问题求助
解决MDX查询返回空值与重复值的问题
问题背景
在Power BI导入数据阶段,尝试通过MDX查询限制从Analysis Services拉取的数据量,初始查询因将不同层级的成员直接放在ROWS轴,触发报错:
AnalysisServices: Members, tuples or sets must use the same hierarchies in the function.
改用CROSSJOIN交叉连接后,结果出现大量空值,导致[Measures].[PERIOD VALUE]重复显示,数据总数偏大。虽可在Power Query编辑器中过滤空值得到正确结果,但需直接在MDX查询层面解决该问题。
初始MDX代码:
SELECT { [Measures].[PERIOD VALUE] } ON COLUMNS, { [DATE].[REPORT_YEAR].[REPORT_YEAR].&[2025], [SCENARIO].[SCENARIO].[SCENARIO].&[Actual], [WBS].[GROUP_CUSTOMER].[GROUP_CUSTOMER], [BUSINESS_ENTITY].[COMPANY_CODE].[COMPANY_CODE], [WBS].[PROJECT].[PROJECT], [DATE].[REPORT_PERIOD].[REPORT_PERIOD]} ON ROWS FROM [FINANCE_GL_SAP]
解决方案
1. 用NON EMPTY过滤空值行
在ROWS轴的交叉连接集合前添加NON EMPTY,自动排除没有有效度量值的行,直接得到无空值的结果:
SELECT { [Measures].[PERIOD VALUE] } ON COLUMNS, NON EMPTY CROSSJOIN( [DATE].[REPORT_YEAR].[REPORT_YEAR].&[2025], [SCENARIO].[SCENARIO].[SCENARIO].&[Actual], [WBS].[GROUP_CUSTOMER].[GROUP_CUSTOMER], [BUSINESS_ENTITY].[COMPANY_CODE].[COMPANY_CODE], [WBS].[PROJECT].[PROJECT], [DATE].[REPORT_PERIOD].[REPORT_PERIOD] ) ON ROWS FROM [FINANCE_GL_SAP]
2. 优化维度层级组合(可选)
针对存在关联关系的维度(比如DATE的年和期间),先组合相关层级再做交叉连接,减少无效的维度组合:
SELECT { [Measures].[PERIOD VALUE] } ON COLUMNS, NON EMPTY CROSSJOIN( -- 先组合日期的年与期间,保证层级关联 [DATE].[REPORT_YEAR].[REPORT_YEAR].&[2025] * [DATE].[REPORT_PERIOD].[REPORT_PERIOD], [SCENARIO].[SCENARIO].[SCENARIO].&[Actual], [WBS].[GROUP_CUSTOMER].[GROUP_CUSTOMER], [BUSINESS_ENTITY].[COMPANY_CODE].[COMPANY_CODE], [WBS].[PROJECT].[PROJECT] ) ON ROWS FROM [FINANCE_GL_SAP]
注:*运算符等价于CROSSJOIN,写法更简洁,适合关联维度层级的组合。
3. 提前筛选维度成员(可选)
如果只需要特定维度的有效成员,提前用FILTER筛选出存在度量值的成员,进一步缩小交叉连接的基数:
SELECT { [Measures].[PERIOD VALUE] } ON COLUMNS, NON EMPTY CROSSJOIN( [DATE].[REPORT_YEAR].[REPORT_YEAR].&[2025] * [DATE].[REPORT_PERIOD].[REPORT_PERIOD], [SCENARIO].[SCENARIO].[SCENARIO].&[Actual], -- 只保留有PERIOD VALUE的客户分组 FILTER([WBS].[GROUP_CUSTOMER].[GROUP_CUSTOMER], NOT ISEMPTY([Measures].[PERIOD VALUE])), [BUSINESS_ENTITY].[COMPANY_CODE].[COMPANY_CODE], -- 只保留有PERIOD VALUE的项目 FILTER([WBS].[PROJECT].[PROJECT], NOT ISEMPTY([Measures].[PERIOD VALUE])) ) ON ROWS FROM [FINANCE_GL_SAP]
关键说明
NON EMPTY是最直接的解决方式,自动过滤度量值为空的行,避免重复数据和无效组合。- 关联维度层级的提前组合,能减少不必要的交叉连接,提升查询效率。
- 提前筛选有效成员,适合超大规模数据集,可显著降低返回的数据量。
内容的提问来源于stack exchange,提问作者Conor Bannigan
相关产品推荐
相关产品推荐

