MDX - 如何将层次结构成员显示为多列
MDX - How to present members of hierarchy as multiple columns
我是 MDX on Analysis Services 的新手。所以我有点问题。如何获取父项中子值的最大值?
例如,我在 SSAS 上使用 AdventureWorksDW。该模型在产品 > 产品类别 > 产品子类别中具有层次结构。
如何获取 [Product].[Subcategory] 的每个成员的 [Measures].[Internet Sales Amount] 的最大值?
比如上图中,从这个数据我要输出:
配件 $245,529.32
自行车 $14,520,584.04
服装 $172,950.68
你可以使用这样的语句:
SELECT [Measures].[Internet Sales Amount]
ON COLUMNS,
Generate([Product].[Category].[Category].Members,
TopCount({[Product].[Category].CurrentMember} * [Product].[Subcategory].[Subcategory].Members,
1,
[Measures].[Internet Sales Amount]
)
)
ON ROWS
FROM [Adventure Works]
Generate
函数循环其第一个参数,对于每个循环 运行 从第二个参数中的表达式计算一个集合,然后连接所有这些集合。
并且此表达式从循环 运行 中的每个类别中获取前 1 个子类别 Internet Sales Amount
,换句话说,即具有最大值的子类别。
回答评论中的附加问题:
如果您不想显示具有最大值的 child 元素,而是想查看 children 的平均值,那么这将是一个完全不同的查询。您现在可以定义自己的度量,而不是使用现有度量和处理行成员选择:
WITH MEMBER Measures.[Avg Child Sales Amount] AS
Avg([Product].[Product Categories].CurrentMember.Children, [Measures].[Internet Sales Amount])
SELECT { [Measures].[Internet Sales Amount], Measures.[Avg Child Sales Amount]}
ON COLUMNS,
[Product].[Category].[Category].Members
ON ROWS
FROM [Adventure Works]
请注意 - 因为我们在这里需要 children,所以我们需要在度量定义中使用用户层次结构 [Product].[Product Categories]
,而不是属性层次结构 [Product].[Category]
和 [Product].[Subcategory]
,我在第一个查询中使用它能够在行 headers 上显示两个单独的列。然而,两者之间的 CurrentMember
是相关联的:用户层次结构的 CurrentMember
是其最低构成属性层次结构的 CurrentMember
。
顺便说一句:如果您对具有最大值的成员不感兴趣,您也可以定义一个类似于我在第二个查询中定义的 avg 成员的 max 度量。然而,通常具有最大值的成员对用户来说是有趣的,因此这是一种技术上有效的解决方案,但对于大多数用例来说并不是一个有用的解决方案。
当然,如果您经常需要这个平均度量,您也可以在立方体中使用聚合方法“children 的平均值”定义一个额外的度量。即使没有 MDX 知识的用户也可以使用它。但这将在所有级别上进行平均:子类别值将是构成产品的平均值,类别值将是子类别的平均值,而上面定义的度量是子类别级别的总和以及子类别到类别的平均值等级.
我是 MDX on Analysis Services 的新手。所以我有点问题。如何获取父项中子值的最大值?
例如,我在 SSAS 上使用 AdventureWorksDW。该模型在产品 > 产品类别 > 产品子类别中具有层次结构。
如何获取 [Product].[Subcategory] 的每个成员的 [Measures].[Internet Sales Amount] 的最大值?
比如上图中,从这个数据我要输出:
配件 $245,529.32
自行车 $14,520,584.04
服装 $172,950.68
你可以使用这样的语句:
SELECT [Measures].[Internet Sales Amount]
ON COLUMNS,
Generate([Product].[Category].[Category].Members,
TopCount({[Product].[Category].CurrentMember} * [Product].[Subcategory].[Subcategory].Members,
1,
[Measures].[Internet Sales Amount]
)
)
ON ROWS
FROM [Adventure Works]
Generate
函数循环其第一个参数,对于每个循环 运行 从第二个参数中的表达式计算一个集合,然后连接所有这些集合。
并且此表达式从循环 运行 中的每个类别中获取前 1 个子类别 Internet Sales Amount
,换句话说,即具有最大值的子类别。
回答评论中的附加问题:
如果您不想显示具有最大值的 child 元素,而是想查看 children 的平均值,那么这将是一个完全不同的查询。您现在可以定义自己的度量,而不是使用现有度量和处理行成员选择:
WITH MEMBER Measures.[Avg Child Sales Amount] AS
Avg([Product].[Product Categories].CurrentMember.Children, [Measures].[Internet Sales Amount])
SELECT { [Measures].[Internet Sales Amount], Measures.[Avg Child Sales Amount]}
ON COLUMNS,
[Product].[Category].[Category].Members
ON ROWS
FROM [Adventure Works]
请注意 - 因为我们在这里需要 children,所以我们需要在度量定义中使用用户层次结构 [Product].[Product Categories]
,而不是属性层次结构 [Product].[Category]
和 [Product].[Subcategory]
,我在第一个查询中使用它能够在行 headers 上显示两个单独的列。然而,两者之间的 CurrentMember
是相关联的:用户层次结构的 CurrentMember
是其最低构成属性层次结构的 CurrentMember
。
顺便说一句:如果您对具有最大值的成员不感兴趣,您也可以定义一个类似于我在第二个查询中定义的 avg 成员的 max 度量。然而,通常具有最大值的成员对用户来说是有趣的,因此这是一种技术上有效的解决方案,但对于大多数用例来说并不是一个有用的解决方案。
当然,如果您经常需要这个平均度量,您也可以在立方体中使用聚合方法“children 的平均值”定义一个额外的度量。即使没有 MDX 知识的用户也可以使用它。但这将在所有级别上进行平均:子类别值将是构成产品的平均值,类别值将是子类别的平均值,而上面定义的度量是子类别级别的总和以及子类别到类别的平均值等级.