Sql 在MDX中使用事实表中的相同列为不同度量构造计算度量
我有一个事实表,有两列对应于维度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个相同的列作为数据。 示例事实表如下所示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 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,
', '
)