MDX成员未被过滤

时间:2017-06-26 18:20:46

标签: ssas mdx

我们正在尝试开发一些MDX查询,允许用户根据事务类型生成计算的利润数。这是一个示例:

WITH MEMBER [Measures].[Profit] AS 
'((Sum({[Transaction Type].[All Transaction Types].[SALE]}, [Measures].[Amount]) + 
Sum({[Transaction Type].[All Transaction Types].[MOTO]}, [Measures].[Amount]) + 
Sum({[Transaction Type].[All Transaction Types].[FORCECAPTURE]}, [Measures].[Amount]) + 
Sum({[Transaction Type].[All Transaction Types].[FORCE]}, [Measures].[Amount]) + 
Sum({[Transaction Type].[All Transaction Types].[RECURRINGSALE2]}, [Measures].[Amount]) + 
Sum({[Transaction Type].[All Transaction Types].[SPECIALFORCE]}, [Measures].[Amount]) + 
Sum({[Transaction Type].[All Transaction Types].[VOICEAUTH]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[VALIDATION]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[REPEATCHECK]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[CONVERSION]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[GENERICCHECK]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[CASHIN]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[CHECKMANUALDEPOSIT]}, [Measures].[Amount]) -
Sum({[Transaction Type].[All Transaction Types].[RECURRINGCREDIT]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[ACH]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[GUARANTEEANDCHECK2]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[RECURRINGACH]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[GUARANTEE]}, [Measures].[Amount]) +
Sum({[Transaction Type].[All Transaction Types].[SUPERVISORAPPROVAL]}, [Measures].[Amount])) - 
Sum({[Transaction Type].[All Transaction Types].[RELOAD]}, [Measures].[Amount]) - 
Sum({[Transaction Type].[All Transaction Types].[CASHOUT]}, [Measures].[Amount]) - 
Sum({[Transaction Type].[All Transaction Types].[CREDIT]}, [Measures].[Amount]))' 
SELECT {{[Measures].[Profit],[Measures].[Transaction Number]}} ON COLUMNS, NON EMPTY {(DESCENDANTS([Location].[All Locations].&[1],1))} ON ROWS FROM ( SELECT ( -{[Voided].[Voided].[Voided].&[true]},
{[Transaction Response].[TransactionResponses].&[APPROVED]},{[Transaction Type].[All Transaction Types].[SALE],[Transaction Type].[All Transaction Types].[CREDIT]}) ON COLUMNS FROM [DashBoardCube]) 
WHERE  ([Time].[YEAR].&[2012])

当我们尝试使用事务类型过滤这些查询时会出现问题,如上面的示例所示。 Profit值总是相同的我认为是因为成员的定义。

有一种方法可以根据我们定义的计算成员对此进行归档吗?

最诚挚的问候,

1 个答案:

答案 0 :(得分:0)

正如您所注意到的,成员[Measures]。[Profit]的定义覆盖了子多维数据集中[Transaction Type]的过滤。 "地址"加起来[Profit]计算成员的元组(例如(MOTO,Amount))是针对整个多维数据集解决的,而不是针对子多维数据集(在您的示例中,没有MOTO成员)。

这很奇怪,但它是MDX的工作方式(至少在SSAS中,我不了解其他平台)。

这相当于组成的T型公式之间的矛盾"利润" (X + Z + Y-A-B)以及您在子多维数据集中指定的子集。

我不确定,因为我无法看到你的要求:但这不是一个真正的矛盾,而不仅仅是MDX的奇怪之处吗?根据您的子多维数据集,您正试图查看SALE-CREDIT。难道这不是一个新的人物,而不是一种特殊类型的"利润"?它真的可以被称为"利润"什么时候它忽略了(-CASHOUT)元素?如果忽略(-CASHOUT)在这种情况下是合适的,你能保证它总是跨越立方体空间,即这个计算总是有意义吗?

一种解决方案可能只是明确指定(SALE-CREDIT)作为您想要的措施,而不会陷入[测量]。[利润]。

另一种可能是给[Transaction Type]维度的每个叶子成员一个属性(Credit或Debit),指定它应该进行的Profit计算的哪一侧。计算成员,类似这样的(伪代码)

Iif([Transaction Types].IsCreditOrDebit.CurrentMember IS [Transaction Types].IsCreditOrDebit.[Credit],Measures.Amount,-Measures.Amount)
然后,

可以在整个[交易类型]维度上聚合,并且可以按交易类型进行分割。