【问题标题】:MDX - How to present members of hierarchy as multiple columnsMDX - 如何将层次结构的成员呈现为多列
【发布时间】:2021-07-14 10:46:29
【问题描述】:

我是 Analysis Services 上的 MDX 新手。所以我有点问题。如何获得父项中子值的最大值?

例如,我在 SSAS 上使用 AdventureWorksDW。该模型在产品 > 产品类别 > 产品子类别中具有层次结构。

如何获取[Product].[Subcategory]的每个成员的[Measures].[Internet Sales Amount]的最大值?

比如上图中,我想从这个数据中输出:

配件 $245,529.32

自行车 $14,520,584.04

服装 $172,950.68

【问题讨论】:

    标签: mdx mdx-query


    【解决方案1】:

    你可以使用类似这样的语句:

    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 知识的用户也可以使用它。但这将在所有级别上进行平均:子类别值将是构成产品的平均值,类别值是子类别的平均值,而上面定义的度量是子类别级别的总和以及子类别到类别的平均值级别。

    【讨论】:

    • 感谢弗兰克,它有效!我也想出了另一个答案,它也返回了正确的结果,尽管我不确定 EXISTING 做了什么:` WITH MEMBER [Measures].[max_test] AS max(EXISTING [Product].[Subcategory].children, [措施].[互联网销售额]) SELECT [Measures].[max_test] ON 0, NON EMPTY [Product].[Category].children ON 1 FROM [Adventure Works]`
    • 我还有一个问题。如果我想获取每个类别的平均子类别而不是最大值,该怎么办?
    • @ToànĐoàn 我将答案添加到我的答案中。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多