【问题标题】:Return Bottomcount of hierarchy level in MDX返回 MDX 中层次结构级别的底部计数
【发布时间】:2015-11-20 09:15:48
【问题描述】:

我正在使用 SSRS 创建一个在 x 轴上显示层次结构的报告。我想根据用户通过性能点过滤器选择的层次结构的最低级别来使级别动态化。例如,如果用户选择 2015 年加上 2004 年 12 月,则报告应该以月为单位,但显示 2014 年 12 月 - 2015 年 12 月(含)。

使用 AdventureWorks 多维数据集 (2008R2),我可以查询 Ship Date Fiscal 层次结构,如下所示:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER

SELECT
    {[SDName], [SDLevel]} ON COLUMNS

    ,STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3],
                [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED) ON ROWS

FROM    [Adventure Works]

STRTOSET 函数将包含用户多选参数的输出。这返回:

如您所见,选择了 3 个不同级别的层次结构(年、季度和月)。我想返回月份级别,即 4。

我已尝试使用 Bottomcount,如下所示:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER

SELECT
    BottomCount
    (
        {[SDName], [SDLevel]},
        1,
        [SDLevel]
    ) ON COLUMNS

    ,STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3],
                [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED) ON ROWS

FROM    [Adventure Works]

但这会返回与上图所示完全相同的结果。

我想知道这是不是因为WHERE子句需要先过滤数据(像SQL一样思考),所以我尝试了:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER

SELECT
    BottomCount
    (
        {[SDName], [SDLevel]},
        1,
        [SDLevel]
    ) ON COLUMNS

    ,[Ship Date].[Fiscal].ALLMEMBERS ON ROWS

FROM    [Adventure Works]
WHERE   (STRTOSET(" {[Ship Date].[Fiscal].[Fiscal Year].&[2011],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3],
                [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED))

但我得到了错误:

我不明白。

我也尝试过使用子查询:

WITH 
    MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME
    MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER

SELECT
    BottomCount
    (
        {[SDName], [SDLevel]},
        1,
        [SDLevel]
    ) ON COLUMNS

    ,[Ship Date].[Fiscal].ALLMEMBERS ON ROWS

FROM    (SELECT STRTOSET("  {[Ship Date].[Fiscal].[Fiscal Year].&[2011],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3],
                [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3],
                [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED) ON COLUMNS
    FROM    [Adventure Works])

但这为我提供了层次结构最低级别的所有成员(尽管已使用 STRTOSET 输入对其进行过滤):

有人可以帮忙吗?我的 MDX 不太好,我正在努力获得正确的输出。

注意:当我开始探索这个问题时,我意识到,我可以解析参数输出以查找层次结构的某些级别,即

@DateSelection LIKE "*[Month]*"

但我希望通过这个练习来提高我的 MDX 技能!

【问题讨论】:

    标签: ssas mdx hierarchy


    【解决方案1】:

    想通了:在查看 this website 时,我注意到 Topcount 函数被应用于行轴,而不是我上面的列。通过改变结构,让 Topcount 过滤行,它返回正确的结果:

    WITH 
        MEMBER [SDName] AS [Ship Date].[Fiscal].CURRENTMEMBER.NAME
        MEMBER [SDLevel] AS [Ship Date].[Fiscal].CURRENTMEMBER.LEVEL_NUMBER
    
    SELECT
        {[SDName], [SDLevel]} ON COLUMNS
    
        ,Topcount(
                    STRTOSET("  {[Ship Date].[Fiscal].[Fiscal Year].&[2011],
                                [Ship Date].[Fiscal].[Fiscal Quarter].&[2006]&[3],
                                [Ship Date].[Fiscal].[Fiscal Quarter].&[2008]&[3],
                                [Ship Date].[Fiscal].[Month].&[2007]&[5]}", CONSTRAINED),
                    1,
                    [SDLevel]) ON ROWS
    
    FROM    [Adventure Works]
    

    请注意,我必须使用 Topcount,因为 order by 是降序的(我想要层次结构的最低级别,即最大级别编号)。结果是:

    希望可以帮助遇到同样问题的其他人。

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-21
      相关资源
      最近更新 更多