计算的尺寸/尺寸

时间:2010-03-03 13:22:26

标签: version-control olap mdx olap-cube

我对MDX比较陌生,我正在努力完成我认为应该是一件容易的事,但我还没有找到任何解决方案。

我有一个销售多维数据集,其中一个衡量标准是利润,可以是负数或正数。我想得到一个实际上是正利润总和的指标,即只在新指标中包含具有正利润的利润数。

这里的技巧是在行细节级别上,如

WITH MEMBER Measures.PositivePNL as IIF(Measures.PNL> 0,Measures.PNL,0)

不起作用,因为它只适用于总数

2 个答案:

答案 0 :(得分:2)

我应该提到我正在使用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 :(得分:1)

如果要在行详细信息级别上在MDX中执行某些操作,则需要一个包含事实表ID的维度(因此维度中的每个成员都表示事实表中的一行)。然后你可以写一个计算:

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

但如果你的事实表中有很多行,这可能会很慢。另一种方法是在事实表中添加一个只包含PNL正值的列。