【发布时间】: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 技能!
【问题讨论】: