如何根据维度属性在MDX中定义计算度量?

Sha*_*ore 5 sql-server olap ssas mdx

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

鉴于:

尺寸

  • 日期
  • LedgerLineItem {收费,付款,注销,复印,信用}

措施

  • LedgerAmount

关系
*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           |
Run Code Online (Sandbox Code Playgroud)

我曾试图通过几种方式创建计算出的度量,每种方法都可以在某些情况下运行,但在其他情况下则不然.现在在有人说在ETL中这样做之前,我已经在ETL中完成了它并且它工作得很好.作为学习更好地理解MDX的一部分,我想要做的是弄清楚如何复制我在MDX中的ETL中所做的事情到目前为止我无法做到这一点.

这是我做过的两次尝试以及它们的问题.仅当分类帐类型位于数据透视表中时,此方法才有效.它返回正确数量的分类帐条目(虽然在这种情况下它与[金额 - 分类帐]相同但是当我尝试删除类型并且只获得所有分类帐条目的总和时它返回未知.

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'  ; 
Run Code Online (Sandbox Code Playgroud)

仅当分类帐类型不在数据透视表中时,此方法才有效.它总是返回总付款金额,这在我按类型切片时是不正确的,因为我只希望看到信用额度,信用部分,付费部分,付费,收费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'  ;  
Run Code Online (Sandbox Code Playgroud)

有没有办法让这个返回正确的数字,无论Ledger.Type是否包含在我的数据透视表中?

Mef*_*eff 7

尝试现有:

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'  ;  
Run Code Online (Sandbox Code Playgroud)

应该让它关注游戏中的成员.