MDX新手求助:获取数据库所有Cube的所有Measure及2017、2018年统计值
嘿,作为MDX新手能想到这么具体的需求已经很赞啦!完全可以实现你要的查询,下面我给你拆解思路和具体语句:
核心思路
要实现这个需求,我们需要结合OLAP系统的元数据视图(用来遍历所有Cube和度量)和实际的时间维度过滤,把每个度量在2017、2018年的总计数据关联起来,最终输出你要的结构化结果。
具体MDX查询语句
这里以常见的SSAS环境为例,给出通用的查询模板,你可以根据自己的数据库调整细节:
WITH -- 定义计算成员,提取当前度量所属的Cube名称 MEMBER [Measures].[CubeName] AS [Measures].CurrentMember.Properties('CUBE_NAME') -- 提取当前度量的名称 MEMBER [Measures].[MeasureName] AS [Measures].CurrentMember.Name -- 提取当前年份维度的名称(比如2017/2018) MEMBER [Measures].[DateYear] AS [Date].[Year].CurrentMember.Name SELECT -- 输出你要的四个列 { [Measures].[CubeName], [Measures].[MeasureName], [Measures].CurrentMember, -- 这里直接取当前度量的数值,替换成你的度量名也可以 [Measures].[DateYear] } ON COLUMNS, -- 交叉所有有效度量和目标年份,过滤空值 NON EMPTY CrossJoin( -- 从系统元数据中获取所有非计算型度量(可根据需求去掉NOT条件) Filter( $SYSTEM.MDSCHEMA_MEASURES.MEMBERS, NOT [Measures].CurrentMember.IsCalculated ), -- 指定要查询的两个年份 {[Date].[Year].[2017], [Date].[Year].[2018]} ) ON ROWS FROM $System -- 针对整个数据库的元数据查询,部分引擎可能需要调整为具体Cube或数据库名
关键细节说明
$SYSTEM.MDSCHEMA_MEASURES是OLAP系统内置的元数据视图,能返回数据库中所有Cube下的所有度量成员,这是实现“遍历所有Cube和度量”的核心。- 如果你不同Cube的时间维度命名不一样(比如有的叫
[Calendar].[Year],有的叫[Time].[Year]),可以考虑统一命名,或者用更灵活的方式匹配年份成员。 - 如果你的度量有统一的数值字段名(比如都叫
[Measures].[TotalValue]),可以把[Measures].CurrentMember替换成这个具体的度量名,结果会更准确。 NON EMPTY用来过滤掉那些在对应年份没有数据的度量记录,避免出现空值行。
执行这个查询后,就能得到你想要的结果格式:
| CubeName | MeasureName | MeasureCount | DateYear |
|---|---|---|---|
| Cube 1 | Price | 150000 | 2017 |
| Cube 1 | Price | 200000 | 2018 |
内容的提问来源于stack exchange,提问作者DW92
相关产品推荐
相关产品推荐

