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

Sql 在MDX中使用事实表中的相同列为不同度量构造计算度量,sql,ssas,mdx,olap,Sql,Ssas,Mdx,Olap,我有一个事实表,有两列对应于维度Dim1,Dim2。 在同一个表中,我还有其他4列Value_Type(int)、int_Value(int)、FLOAT_Value(FLOAT)、TEXT_Value(string)。 有许多度量值由值_类型标识,根据其性质,可以写入3列(INT_值(INT)、FLOAT_值(FLOAT)、TEXT_值(string))中的一列 假设度量值类型为1的度量值1是年龄,2是账户余额,3是名称。 可能还有其他度量类型使用这3个相同的列作为数据。 示例事实表如下所示

我有一个事实表,有两列对应于维度Dim1,Dim2。 在同一个表中,我还有其他4列Value_Type(int)、int_Value(int)、FLOAT_Value(FLOAT)、TEXT_Value(string)。 有许多度量值由值_类型标识,根据其性质,可以写入3列(INT_值(INT)、FLOAT_值(FLOAT)、TEXT_值(string))中的一列 假设度量值类型为1的度量值1是年龄,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个度量值。 其思想是为从右字段返回值的每个度量值构造一个计算成员。 例如,对于Measure1,我们采用测量类型为1的INT_值。 问题是我不知道如何为这些计算成员构造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

由于浮点和整数可以求和,我认为
Measure1
Measure2
没有什么特别的需要。假设示例表中的空字段是
null
s,您甚至不需要任何
measure\u type
列,因为跨null求和是可以的,即。E通过将不同度量值类型的三条记录合并为一条,并省略
null
值,可以将事实表压缩到其大小的三分之一

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

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

Generate((现有[text].[text value].[text value].成员)
-{[text].[text value].]}
作为一个,
a、 当前名称,
', '
)
  • 使标注或属性不可见
当然,您不需要在事实表中物理地创建维度表和外键,也可以在数据源视图中以视图或命名查询的形式生成它们


您可以使用与我使用的逗号和空格不同的分隔符,这是。

字符串不能聚合的第三个参数。如果您不在选择的最底层,您希望为度量值3显示什么?我需要度量值_type=3的文本值。显然有一个函数可以连接文本值。在Analysis Services中不能将字符串连接为聚合。不,我指的是可以在计算成员中使用的函数
Generate( (EXISTING [text].[text value].[text value].members )
                    - { [text].[text value].[<n/a>] } 
          as a,
          a.Current.Name,
          ', '
        )