Расчетная мера / размерность - PullRequest
2 голосов
/ 03 марта 2010

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

У меня есть куб продаж, и одним из показателей является прибыль, которая может быть отрицательной или положительной. Я хочу получить один показатель, который фактически представляет собой сумму положительной прибыли, т. Е. Включить в новый показатель только те показатели прибыли, которые имеют положительную прибыль.

Хитрость здесь в том, что это на уровне детализации строки и что-то вроде

С ЧЛЕНАМИ Measures.PositivePNL как IIF (Measures.PNL> 0, Measures.PNL, 0)

не работает, так как работает только с совокупным числом

Ответы [ 2 ]

2 голосов
/ 03 марта 2010

Я должен был упомянуть, что я использую Mondrian / MySQL. Я пришел к аналогичному выводу, но нашел способ создать новое вырожденное измерение, используя выражение ключа SQL (поэтому мне не нужно добавлять столбец в таблицу):

<Dimension name="PNLCategory">
    <Hierarchy hasAll="true">
        <Level name="PNLCategory" column="pnlCategory" uniqueMembers="true">
            <KeyExpression>
                <SQL dialect="generic"> <![CDATA[IF(pnl >= 0,'Winner','Loser')]]></SQL>
            </KeyExpression>
        </Level>
    </Hierarchy>
</Dimension>

Теперь становится легко сделать вычисляемый член:

<CalculatedMember name="WinnersCountByPNL" aggregator="count" dimension="Measures">
  <Formula>([PNLCategory].[Winner], Measures.PNL)</Formula>
  <CalculatedMemberProperty name="FORMAT_STRING" value="$#,###"/>
  <CalculatedMemberProperty name="DATATYPE" value="Numeric"/>
</CalculatedMember>     

поэтому здесь я ограничиваю суммирование только «победителями», и преимущество заключается в том, что Мондриан не будет извлекать записи (факты) из таблицы строк.

1 голос
/ 03 марта 2010

Если вы хотите что-то сделать в MDX на уровне детализации строки, вам понадобится измерение, содержащее идентификатор таблицы фактов (поэтому каждый элемент измерения представляет строку в таблице фактов). Тогда вы можете написать расчет:

WITH MEMBER Measures.PositivePNL as
'
Sum([DimFactId].[DimFactId].Members, IIF(Measures.PNL > 0, Measures.PNL, 0))
'

Но это может быть медленным, если в вашей таблице фактов много строк. Альтернативой является добавление в таблицу фактов столбца, содержащего только положительные значения PNL.

...