我正在使用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技能!
答案 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是降序的(我想要层次结构的最低级别,即最大级别的数字)。结果是:
希望这可以帮助其他人解决同样的问题。