在MDX

时间:2015-11-20 09:15:48

标签: ssas mdx hierarchy

我正在使用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函数将包含用户多选参数的输出。这将返回:

Basic results of query

如您所见,已选择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))

但是我收到了错误:

Error message

我不明白。

我也尝试过使用子查询:

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输入过滤了它):

All members

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

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

@DateSelection LIKE "*[Month]*"

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

1 个答案:

答案 0 :(得分:0)

想出来:在查看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是降序的(我想要层次结构的最低级别,即最大级别的数字)。结果是:

Correct results

希望这可以帮助其他人解决同样的问题。