【问题标题】:How to sort specific Hierarchy Level in OLAP (SSAS) via MDX如何通过 MDX 对 OLAP (SSAS) 中的特定层次结构级别进行排序
【发布时间】:2014-02-26 21:06:17
【问题描述】:

我正在使用 SSAS OLAP,我想对层次结构的级别进行排序。

我知道我可以通过 ORDER 函数对整个层次结构进行排序(当我尝试对整个层次结构应用 DESC 排序时遇到一些问题),但我真正想要实现的是特定级别的排序。例如在 [Date].[Calendar] 层次结构(Adventure Works Cube)中,我希望对年份进行 ASC 排序,对 Quarter 进行 DESC 排序,ASC 月份排序等。 我不想破坏层次结构(使用 BASC 或 BDESC),我只需要将它们排序在同一级别。您是否知道这是否可能,因为我找不到类似的东西?

【问题讨论】:

    标签: sorting ssas mdx hierarchy olap


    【解决方案1】:

    您可以做的是交叉连接有序的对应属性层次结构。您能否验证以下结果:

    select
    [Measures].[Internet Sales Amount] on 0,
    
    Order(
    [Date].[Calendar Year].[Calendar Year].MEMBERS,
    [Measures].[Internet Sales Amount]
    ,ASC)
    *
    Order(
    [Date].[Calendar Quarter of Year].[Calendar Quarter of Year].MEMBERS,
    [Measures].[Internet Sales Amount]
    ,DESC)
    *
    Order(
    [Date].[Calendar].[Month].MEMBERS,
    [Measures].[Internet Sales Amount]
    ,ASC)
    
    ON 1
    from [Adventure Works]
    

    包括所有成员可能会有所帮助([Date].[Calendar Year] 而不是 [Date].[Calendar Year] 在第一个交叉连接集的情况下)

    菲利普,

    【讨论】:

    • 感谢您的回答菲利普!不幸的是,这不起作用-也许我不够清楚-我的想法是根据它们的键对级别进行排序,而不是按度量。例如,如果我们有以下结构: -2009 -Q1 -Jan -Feb -Q2 -May -June -2010 -Q1 -Jan -Feb -Q2 -May -June 我希望能够对以下数据进行排序订单(年份 DESC,季度 ASC,月份 DESC):-2010 -Q1 -Feb -Jan -Q2 -June -May -2009 -Q1 -Feb -Jan -Q2 -June -May
    【解决方案2】:

    以下是一个可行的解决方案,如果不是一个非常好的解决方案:

    WITH MEMBER Measures.[year] as
                [Date].[Calendar].CurrentMember.Properties('Key0', typed)
         MEMBER Measures.[qtr or mth] as
                [Date].[Calendar].CurrentMember.Properties('Key1', typed)
         MEMBER Measures.[sortKey] as
                CASE
                    WHEN [Date].[Calendar].CurrentMember.Level IS [Date].[Calendar].[Calendar Year] THEN
                         Measures.[year] * 1000
                    WHEN [Date].[Calendar].CurrentMember.Level IS [Date].[Calendar].[Calendar Quarter] THEN
                         Measures.[year] * 1000 + (5 - Measures.[qtr or mth]) * 100
                    ELSE // month
                         Measures.[year] * 1000 + (4 -  Int((Measures.[qtr or mth] - 1) / 3)) * 100 + Measures.[qtr or mth]
                END
    SELECT {Measures.[year], Measures.[qtr or mth], Measures.[sortKey]}
           ON COLUMNS,
           Order(
                   [Date].[Calendar].[Calendar Year]
                   +
                   [Date].[Calendar].[Calendar Quarter]
                   +
                   [Date].[Calendar].[Month]
                   ,
                   Measures.[sortKey]
                   ,BASC
           )
           ON ROWS
    FROM [Adventure Works]
    

    列上的度量只是为了说明它是如何工作的。主要逻辑是生成sortKey 度量,它生成一个整数键,如下所示:四位数字表示年份,一位数字表示倒数季度(Q4 -> 1,... Q1 -> 4),两个月份的数字。然后,使用它,可以直接调用Order 来返回排序集。

    【讨论】:

      【解决方案3】:

      事实证明,不可能达到预期的效果——没有这样的MDX查询可以用不同的排序类型对不同的级别进行排序。更多信息请访问this thread

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-08
        • 2020-12-25
        相关资源
        最近更新 更多