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

时间:2014-04-10 16:03:50

标签: sql ssas mdx olap

我有一个事实表,其中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)) 假设Measure1与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,我们采用带有measure_type = 1的INT_VALUE。 问题是我不知道如何为这些计算成员构造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

1 个答案:

答案 0 :(得分:1)

由于浮点数和整数可以相加,我认为Measure1Measure2不需要特殊内容。假设您的示例表中的空字段是null s,您甚至不需要measure_type列来处理任何内容,因为对空值进行求和很好,i。即通过将不同度量类型的三个记录合并为一个,并省略null值,可以将事实表折叠为其大小的三分之一。

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

  • 使用数字主键列和文本值列中的不同值创建维度表。对于dim1和dim2的组合没有text_value的情况,我建议在此表中添加一个带有'<n/a>'等特殊文本的记录。在Analysis Services中避免使用null属性值和null外键通常是个好主意。
  • 在每个记录中引用此维度的事实表中添加外键。
  • 在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的第三个参数。