在 MDX 中为使用事实表中的相同列的不同度量构造计算度量

Posted

技术标签:

【中文标题】在 MDX 中为使用事实表中的相同列的不同度量构造计算度量【英文标题】:Constructing Calculated Measures in MDX for different measures using same columns in a fact table 【发布时间】:2014-04-10 16:03:49 【问题描述】:

我有一个事实表,其中有 2 列对应于维度 Dim1、Dim2。 在同一张表中,我还有 4 个其他列 Value_Type(int)、INT_VALUE(int)、FLOAT_VALUE(float)、TEXT_VALUE(string)。 有许多由 Value_Type 标识的度量值,根据它们的性质,可以写入 3 列之一(INT_VALUE(int)、FLOAT_VALUE(float)、TEXT_VALUE(string)) 为清楚起见,假设 Measure_Type=1 的 Measure1 是年龄,2 是帐户余额,3 是名称。 可能有其他度量类型使用这 3 个相同的数据列。 所以样本事实表看起来像这样

Dim1    Dim2    Measure_Type      INT_VALUE       FLOAT_VALUE    TEXT_VALUE
10      10      1                 25         
10      10      2                                  2000,34   
10      10      3                                                John
10      20      1                 28         
10      20      2                                  3490,23   
10      20      3                                                Frank

我的任务是为每个 Dim1、Dim2 组合编写一个 MDX 查询,该查询返回同一行中的所有 3 个度量。 这个想法是为每个从正确字段返回值的 Measure 构造一个计算成员。 例如,对于 Measure1,我们采用 INT_VALUE,measure_type=1。 问题是我不知道如何为这些计算成员构造 MDX 查询。 你能帮帮我吗?

所以我的最终目标是编写一个 MDX 查询,为每一组 Dim1、Dim2 返回一行中的所有度量

SELECT [Measure1], [Measure2], [Measure3] ON COLUMNS,
NON EMPTY [Dim1].[Dim1].[Dim1].Members*[Dim2].[Dim2].[Dim2].Members ON ROWS
FROM [Cube]

Dim1    Dim2    Measure1    Measure2    Measure3
10      10      25          2000,34     John
10      20      28          3490,23     Frank

【问题讨论】:

字符串不能被聚合。如果您不在选择的最底层,您希望为 Measure3 显示什么? 我需要一个 measure_type=3 的文本值。显然有一个连接文本值的函数。 在 Analysis Services 中无法将字符串连接为聚合。 不,我的意思是我可以在计算成员中使用的函数 【参考方案1】:

由于浮点数和整数可以相加,我认为Measure1Measure2 没有什么特别需要的。假设您的示例表中的空字段是nulls,您甚至不需要任何measure_type 列,因为对空值求和很好,即。 e.您可以通过将不同度量类型的三个记录合并为一个,并省略 null 值,将事实表折叠到其大小的三分之一。

因此,我们剩下的是字符串值的聚合。由于字符串不能用作物理度量,我们必须将此列放在一个属性中,并将聚合实现为计算度量。为此,您可以按照以下步骤进行:

创建仅包含数字主键列和文本值列中的不同值的维度表。我建议在此表中添加一条带有特殊文本(如 '<n/a>')的记录,以应对没有用于 dim1 和 dim2 组合的 text_value 的情况。在 Analysis Services 中避免空属性值和空外键通常是一个好主意。 将外键添加到从每条记录中引用此维度的事实表。 在 BIDS 中,创建维度,我们将其命名为 text,我假设该属性名为 text value。在多维数据集编辑器中设置度量值组和维度之间的引用。 使用以下表达式为 Measure3 定义计算度量:

.

Generate( (EXISTING [text].[text value].[text value].members )
                    -  [text].[text value].[<n/a>]  
          as a,
          a.Current.Name,
          ', '
        )
使维度或属性不可见。

当然,你不需要在事实表中物理创建维度表和外键。你也可以在数据源视图中将它们生成为视图或命名查询。

您可以使用不同于我使用的逗号和空格的分隔符,这是Generate MDX function 的第三个参数。

【讨论】:

以上是关于在 MDX 中为使用事实表中的相同列的不同度量构造计算度量的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MDX 中基于维度属性定义计算度量?

MDX:按度量的表值过滤成员集

维度成员作为 MDX 中的计算度量

如何根据 OLAP 多维数据集中的度量计算不同的计数

MDX 获取层次结构值

具有在多个事实表中发生的度量的事实表设计