2015-11-20 2 views
0

Я использую 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 будет содержать вывод пользовательского параметра множественного выбора. Это возвращает:

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] 

но это возвращает точно такие же результаты, как показано на рисунке выше.

Я задавался вопросом, было ли это потому, что ИНЕКЕ необходимо фильтровать данные первого (мышление как 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 навыки!

ответ

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 потому что заказ по нисходит (я хотел самый низкий уровень иерархии, т.е. наибольшее количество уровней).Результаты:

Correct results

Надежда, которая может помочь кому-то еще с той же проблемой.

Смежные вопросы