【发布时间】: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 是否包含在我的数据透视表中,有什么方法可以让它返回正确的数字?
【问题讨论】:
标签: sql-server ssas olap mdx