计算的度量/维度

Posted

技术标签:

【中文标题】计算的度量/维度【英文标题】:Calculated measure/dimension 【发布时间】:2010-03-03 13:22:25 【问题描述】:

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

我有一个销售立方体,其中一项衡量标准是利润,可以是负数或正数。我想得到一种衡量标准,它实际上是正利润的总和,即只在新衡量标准中包括那些具有正利润的利润数字。

这里的诀窍是在行详细信息级别上,类似于

WITH MEMBERmeasures.PositivePNL 作为 IIF (Measures.PNL > 0,Measures.PNL,0)

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

【问题讨论】:

【参考方案1】:

我应该提到我正在使用 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>     

所以在这里我将总和限制为只有“赢家”,好处是 Mondrian 不会从行表中检索 count(fact) 条目。

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于计算的度量/维度的主要内容,如果未能解决你的问题,请参考以下文章

维度成员作为 MDX 中的计算度量

计算的度量/维度

维度模型数据仓库基础对象概念一览

Tableau基础 维度?度量?

通过过滤度量值在 MDX 中定义计算成员

saiku 显示中文出现乱码,显示维度和度量时中文乱码,但是查询结果是正确的,求解答!!急!!谢谢