MDX для процента от общего количества для подмножества иерархии - PullRequest
2 голосов
/ 08 февраля 2012

У меня есть кое-что из основного вопроса MDX.Мне нужно рассчитать процент от общего количества в иерархии, и у меня возникают проблемы, когда я хочу получить результирующий набор, который не включает в себя полную иерархию.

У меня довольно простое измерение, которое выглядит как

Groups
    Group A
        Item 1
        Item 2
        Item 3
    Group B
        Item 4
        Item 5
    Group C
        Item 6
        Item 7
        Item 8

Я использую вычисленную меру, которую я нашел в своих показаниях, которая хорошо работает, если я смотрю на полную иерархию, но разваливается, когда я хочу посмотреть на подмножество.

ДляНапример,

WITH MEMBER [Measures].[Percent] AS iif([Measures].[Result Count] = 0,
NULL,
IIF(isempty( ([Measures].[Result Count], Axis(1)(0)( Axis(1)(0).Count - 1).Dimension.CurrentMember.Parent )),1,
[Measures].[Result Count] / ( [Measures].[Result Count], Axis(1)(0)( Axis(1)(0).Count - 1 ).Dimension.CurrentMember.Parent ))), FORMAT_STRING ="#,##0.00 %;-#,##0.00 %"
SELECT
   { [Measures].[Result Count],[Measures].[Percent] } ON COLUMNS,
   { [Groups].[Group Participation]} ON ROWS
FROM [Cube]

Я получаю следующее:

        Result Count    Percent
Group A     1541            11.92 %
Group B     2300            17.79 %
Group C     9086            70.29 %

Что прекрасно работает.Однако, если я хочу только Группу B и Группу C:

WITH MEMBER [Measures].[Percent] AS iif([Measures].[Result Count] = 0,
NULL,
IIF(isempty( ([Measures].[Result Count], Axis(1)(0)( Axis(1)(0).Count - 1 ).Dimension.CurrentMember.Parent )),1,
[Measures].[Result Count] / ( [Measures].[Result Count], Axis(1)(0)( Axis(1)(0).Count - 1 ).Dimension.CurrentMember.Parent ))), FORMAT_STRING ="#,##0.00 %;-#,##0.00 %"
SELECT
   { [Measures].[Result Count],[Measures].[Percent] } ON COLUMNS,
   { [Groups].[Group Participation].&[1],[Groups].[Group Participation].&[2]} ON ROWS
FROM [Cube]

, я получаю следующее:

        Result Count    Percent
Group B     2300            17.79 %
Group C     9086            70.29 %

Я хочу

        Result Count    Percent
Group B     2300            20.20 %
Group C     9086            79.79 %

По сути, мне нужносумма процентов, чтобы сложить до 100.

Мне также это нужно для работы на конечных узлах.когда я изменяю статус, чтобы вернуть только пункт 4, пункт 5, пункт 6

WITH MEMBER [Measures].[Percent] AS iif([Measures].[Result Count] = 0,
NULL,
IIF(isempty( ([Measures].[Result Count], Axis(1)(0)( Axis(1)(0).Count - 1 ).Dimension.CurrentMember.Parent )),1,
[Measures].[Result Count] / ( [Measures].[Result Count], Axis(1)(0)( Axis(1)(0).Count - 1 ).Dimension.CurrentMember.Parent ))), FORMAT_STRING ="#,##0.00 %;-#,##0.00 %"
SELECT
   { [Measures].[Result Count],[Measures].[Percent] } ON COLUMNS,
   { [Groups].[Group].&[4],[Groups].[Group].&[5],[Groups].[Group].&[6]} ON ROWS
FROM [Cube]

я получаю следующее:

    Result Count    Percent 
Item 4  103             4.48 %
Item 5  12              0.52 %
Item 6  455             19.78 %

Я хочу получить

    Result Count    Percent 
Item 4  103             18.07 %
Item 5  12              2.10 %
Item 6  455             79.82 %

Я чувствую, что упускаю что-то очень простое.Что я делаю не так в моей рассчитанной мере?

Заранее спасибо.

Ответы [ 2 ]

3 голосов
/ 09 ноября 2012

Я решил эту проблему, указав элементы измерения (конечные узлы) отфильтрованного представления в вычисленном процентном члене вместо использования axis().В веб-приложении, над которым я работаю, MDX генерируется на лету, поэтому его было легко реализовать.

В приведенном выше примере это будет означать, что для конечных узлов (примеры, которые возвращают элементы 4,5и 6) это должно выглядеть так:

[Measures].[Result Count] / SUM( { [Groups].[Group].&[4],
      [Groups].[Group].&[5],[Groups].[Group].&[6]}, [Measures].[Result Count] )

вместо:

[Measures].[Result Count] / ( [Measures].[Result Count], 
    Axis(1)(0)( Axis(1)(0).Count - 1 ).Dimension.CurrentMember.Parent )
1 голос
/ 09 февраля 2012

Вам больше не следует использовать «естественную» иерархию измерения (родителя), чтобы получить итоговое значение, но используйте сумму по оси в вычисляемых элементах.

WITH MEMBER [Measures].[Percent] AS [Measures].[Result Count] / Sum( Axis(1), [Measures].[Result Count])  , FORMAT_STRING = 'percent'

Это должно получить ваш «визуальный» процент.

...