如何在 MDX 中基于维度属性定义计算度量?

Posted

技术标签:

【中文标题】如何在 MDX 中基于维度属性定义计算度量?【英文标题】:How do I define a Calculated Measure in MDX based on a Dimension Attribute? 【发布时间】:2010-04-16 17:35:24 【问题描述】:

我想创建一个计算度量,该度量仅根据维度属性汇总我的事实表中的特定记录子集。

给定:

维度

日期 LedgerLineItem 费用、付款、核销、共付额、信用

措施

账本金额

关系 * LedgerLineItem 是 FactLedger 的退化维度

如果我按 LedgerLineItem.Type 细分 LedgerAmount,我可以轻松查看收费、支付、信用等金额,但是当我不按 LedgerLineItem.Type 细分时,我无法轻松添加信用、支付、信用、等进入数据透视表。我想创建单独的计算度量,仅汇总特定类型(或多种类型)的分类帐事实。

所需输出的示例是:

| Year  | Charged | Total Paid | Amount - Ledger |
| 2008  | $1000   | $600       | -$400           |
| 2009  | $2000   | $1500      | -$500           |
| Total | $3000   | $2100      | -$900           |

我尝试了几种方法来创建计算度量,每种方法在某些情况下都有效,但在其他情况下无效。现在,在有人说在 ETL 中执行此操作之前,我已经在 ETL 中完成了它并且它工作得很好。作为学习更好地理解 MDX 的一部分,我想做的是弄清楚如何在 MDX 中复制我在 ETL 中所做的事情,因为到目前为止我无法做到这一点。

这是我做过的两次尝试以及它们的问题。 这仅在分类帐类型位于数据透视表中时才有效。它返回正确数量的分类帐条目(尽管在这种情况下它与 [amount - ledger] 相同,但是当我尝试删除类型并仅获取所有分类帐条目的总和时,它返回未知。

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS CASE WHEN ([Ledger].[Type].currentMember = [Ledger].[Type].&[Credit]) 
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Paid])
OR ([Ledger].[Type].currentMember = [Ledger].[Type].&[Held Money: Copay])
THEN [Measures].[Amount - ledger] 
ELSE 0
END 
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ; 

仅当分类帐类型不在数据透视表中时才有效。它总是返回总付款金额,当我按类型切片时这是不正确的,因为我只希望看到信用额度下的信用部分、支付部分、支付不足、收费 0 美元等。

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS sum(([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid])
, ([Ledger].[Type].&[Held Money: Copay])
,  [Measures].[Amount - Ledger])
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ;  

无论 Ledger.Type 是否包含在我的数据透视表中,有什么方法可以让它返回正确的数字?

【问题讨论】:

【参考方案1】:

试试现有的:

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS sum(Existing(([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid])
, ([Ledger].[Type].&[Held Money: Copay]))
,  [Measures].[Amount - Ledger])
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ;  

应该让它关注在场的成员。

【讨论】:

你摇滚!这正是我想要的。【参考方案2】:

无法评论 Meff 的答案,所以我会发布自己的答案。

您应该考虑使用 Aggregate 而不是 Sum,因为结果可能并不总是您期望使用 Sum 得到的结果:

CREATE MEMBER CURRENTCUBE.[Measures].[Received Payment]
AS Aggregate(Existing(([Ledger].[Type].&[Credit]), ([Ledger].[Type].&[Paid])
, ([Ledger].[Type].&[Held Money: Copay]))
,  [Measures].[Amount - Ledger])
, FORMAT_STRING = "Currency"
, VISIBLE = 1 
, ASSOCIATED_MEASURE_GROUP = 'Ledger'  ; 

【讨论】:

AGGREGATE,默认情况下将返回与 SUM 相同的结果。 AGGREGATE 实际上优于 SUM,因为它可以与其他聚合函数一起使用。【参考方案3】:

我假设 Ledger 维度在 FactLedger 中有一个键,但它不能与第一个 MDX 计算成员正确汇总的问题让我相信您可能需要为此重新考虑层次结构。

那么基于您的分类帐类型的简单 SUM 就可以了,这有意义吗?

【讨论】:

一个基于分类帐类型的简单 SUM 确实有效,除非我不想在我的数据透视表中包含分类帐类型,这种情况很常见。我想要完成的是显示不同类型的总数,而不必将这些类型作为单独的实体包含在数据透视表中,例如,如果我想要更广泛地了解我的业务,​​例如总收费、支付和员工工作时间.员工工作时间不会按分类账类型划分,因此在所有情况下,必须按分类账类型划分以获得总收费和支付对我来说并不是一个很好的解决方案,仅在特定分类账报告中。

以上是关于如何在 MDX 中基于维度属性定义计算度量?的主要内容,如果未能解决你的问题,请参考以下文章

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

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

MDX 计算的测量计数

MDX SSAS OLAP -- 根据维度选择切换属性

在 MDX 中使用“不同定义”计算相同度量的差异

如何在 MDX 中对同一维度进行分组和过滤