在 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】:由于浮点数和整数可以相加,我认为Measure1
和Measure2
没有什么特别需要的。假设您的示例表中的空字段是null
s,您甚至不需要任何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 中为使用事实表中的相同列的不同度量构造计算度量的主要内容,如果未能解决你的问题,请参考以下文章