MDX如何通过先筛选最早年月避免超时,获取商品首次零售价的生效日期
问题根源
你的报错是两个核心问题共同导致的:
- 类型不匹配:
[Measures].[First Month]取的是年月的字符串名称,而你对比的[Date].[Year Month].[Year Month]是维度成员对象,二者类型不同,判断条件永远不成立,Filter返回空集合,调用ITEM(0)时就会抛出空引用报错 - 逻辑错误:遍历
[Date].[Date].[Date].MEMBERS时,你没有取当前日期对应的年月名称做对比,而且全量遍历日期维度成员也会导致查询效率极低,违背了你先定位年月缩小范围的优化初衷
可行解决方案
直接调整计算成员的定义即可,优先返回年月的成员对象而非字符串,再通过DESCENDANTS直接取对应年月下的日期成员,过滤出有零售价的首个日期:
WITH -- 先返回首次有零售价的年月成员,不直接取名称,方便后续定位日期范围 MEMBER [Measures].[First Month Member] AS FILTER([Date].[Year Month].[Year Month].MEMBERS, [Measures].[Item Retail Price] > 0).ITEM(0) -- 加非空判断避免无价格商品报错 MEMBER [Measures].[First Date] AS IIF( ISEMPTY([Measures].[Item Retail Price]), NULL, FILTER( -- 直接取目标年月下的所有日期成员,无需遍历全量日期 DESCENDANTS([Measures].[First Month Member], [Date].[Date].[Date]), [Measures].[Item Retail Price] > 0 ).ITEM(0).NAME ) SELECT {[Measures].[First Date], [Measures].[Item Retail Price]} ON 0, [Item].[Item Code].[Item Code].MEMBERS ON 1 FROM ( SELECT ( { [Item].[Category Code].&[558] } ) ON COLUMNS FROM ( SELECT ( { [Item].[Company].&[CANADA] } ) ON COLUMNS FROM ( SELECT ( { [Reporting Currency].[Reporting Currency].[CAD - Canadian dollar] } ) ON COLUMNS FROM [DATABASE]))) WHERE ( [Reporting Currency].[Reporting Currency].[CAD - Canadian dollar], [Item].[Company].&[CANADA], [Item].[Category Code].&[558] )
优化说明
上述写法完全符合你先缩小区间再查询的思路,只会遍历目标年月下的少量日期成员,不会触发全量日期维度扫描,不会出现超时问题。
内容的提问来源于stack exchange,提问作者GigaFluxx
相关产品推荐
相关产品推荐

