Я использую SSRS для создания отчета, в котором иерархия отображается по оси x. Я хотел бы сделать динамический уровень на основе самого низкого уровня иерархии, которую пользователь выбирает через фильтр производительности. Например, если пользователь выбирает 2015 плюс декабрь 2004 года, отчет должен быть в гранулярности месяца, но показываться с декабря 2014 года по декабрь 2015 года включительно.Return Bottomcount уровня иерархии в MDX
Используя куб AdventureWorks (2008R2), можно запросить корабль Дата фискальной иерархии следующим образом:
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]
но это возвращает точно такие же результаты, как показано на рисунке выше.
Я задавался вопросом, было ли это потому, что ИНЕКЕ необходимо фильтровать данные первого (мышление как 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 навыки!