你可以使用类似这样的语句:
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,换句话说,就是具有最大值的那个。
要回答您评论中的附加问题:
如果您不想显示具有最大值的子元素,而是希望查看子元素的平均值,那么这将是一个完全不同的查询。您现在可以定义自己的度量,而不是使用现有度量并处理行成员选择:
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]
请注意 - 因为我们需要孩子,所以我们需要在度量定义中使用用户层次结构[Product].[Product Categories],而不是我在第一个查询中使用的属性层次结构[Product].[Category] 和[Product].[Subcategory]能够在行标题上显示两个单独的列。然而,两者之间的CurrentMember 是相关联的:用户层次结构的CurrentMember 是其构成属性层次结构中最低的CurrentMember。
顺便说一句:如果您对具有最大值的成员不感兴趣,您也可以定义一个类似于我在第二个查询中定义的 avg 成员的最大度量。但是,通常具有最大值的成员对用户来说是有趣的,因此这是一个技术上有效的解决方案,但对于大多数用例来说不是一个有用的解决方案。
当然,如果您经常需要这个平均度量,您还可以在多维数据集中使用聚合方法“平均子项”定义一个附加度量。即使没有 MDX 知识的用户也可以使用它。但这将在所有级别上进行平均:子类别值将是构成产品的平均值,类别值是子类别的平均值,而上面定义的度量是子类别级别的总和以及子类别到类别的平均值级别。