能否在Mondrian MDX中编写两个Cube的UNION查询?附示例
在Mondrian MDX中实现多Cube的UNION查询
当然可以在Mondrian MDX中对两个Cube执行UNION操作!不过有个关键前提——这两个Cube的维度结构需要兼容(比如拥有相同的层级、成员类型,或者你能通过MDX函数将它们对齐),这样UNION才能正确合并结果集。
基础实现示例
假设Sales_INDIA和Sales_Germany两个Cube都包含[Time].[Year]、[Product].[Category]维度,以及[Measures].[Sales Amount]度量,你可以通过以下方式实现UNION:
SELECT {[Measures].[Sales Amount]} ON COLUMNS, NON EMPTY UNION( -- 从Sales_INDIA提取数据,添加Cube标识便于区分来源 [Time].[Year].Members * [Product].[Category].Members * [Sales_INDIA].[Cube Name].&[Sales_INDIA], -- 从Sales_Germany提取数据,同理添加标识 [Time].[Year].Members * [Product].[Category].Members * [Sales_Germany].[Cube Name].&[Sales_Germany] ) ON ROWS FROM [Sales_INDIA], [Sales_Germany]
核心注意事项
- 维度必须对齐:参与UNION的两个结果集,维度的数量、层级结构要一致。如果某个Cube缺少某个维度,可以用
NULL或ALL MEMBERS补全,或者用CROSSJOIN调整结构。 - 标记数据来源:上面例子中添加的
[Cube Name]成员,是为了在结果中清晰区分数据来自哪个Cube,你也可以用计算成员自定义标记。 - 过滤空行:
NON EMPTY用于过滤没有度量值的空行,让结果更简洁。 - 跨Cube查询基础:必须在
FROM子句中同时指定两个Cube,这是Mondrian支持跨Cube操作的前提。
处理维度不匹配的情况
如果两个Cube维度不完全一致(比如Sales_Germany多了[Region].[State]维度),可以用NULL填充缺失的维度部分:
SELECT {[Measures].[Sales Amount]} ON COLUMNS, NON EMPTY UNION( -- Sales_INDIA没有State维度,用NULL填充对应位置 [Time].[Year].Members * [Product].[Category].Members * {NULL} * [Sales_INDIA].[Cube Name].&[Sales_INDIA], -- Sales_Germany保留完整的State维度 [Time].[Year].Members * [Product].[Category].Members * [Region].[State].Members * [Sales_Germany].[Cube Name].&[Sales_Germany] ) ON ROWS FROM [Sales_INDIA], [Sales_Germany]
只要保证两个Cube的结果集在列结构(维度+度量)上兼容,就可以通过UNION()轻松合并数据。遇到结构差异时,灵活使用MDX的维度调整函数就能解决问题。
内容的提问来源于stack exchange,提问作者Khilesh Chauhan
相关产品推荐
相关产品推荐

