MDX计算错误的优先顺序

时间:2010-10-27 10:46:02

标签: ssas mdx olap-cube

我遇到了MDX查询的问题,我认为它归结为计算聚合和计算成员之间的优先顺序。

让我从基础数据开始,这些数据围绕着估值(具有日期,以及其他一些数据,例如成员类型,方案 - 对于这个问题至关重要;加载因子)和相关值。

数据

估价表

Id | Valuation Date | Member Type | Scheme   | Loading Factor
=============================================================
1  | 2010-01-01     | TypeA       | Scheme X | 0.02
2  | 2010-01-01     | TypeB       | Scheme X | 0.02
3  | 2010-01-01     | TypeA       | Scheme Y | 0.02
4  | 2010-01-01     | TypeB       | Scheme Y | 0.02

ValuationValue表

ValuationId | Value
====================
1           | 1000.0
2           | 2000.0
3           | 3000.0
4           | 4000.0

当加载到多维数据集中时,它具有Valuation维度,其属性为MemberType,Scheme和date。包含Value度量的Measure组ValuationValue的多维数据集,以及包含加载因子的Valuation度量值组,如下所示:

Cube
 -Measure Groups
  - Valuation
    |_Loading Factor
  - ValuationValue
    |_Value
 - Dimensions
  - Valuation
    |_MemberType
    |_Scheme
    |_Date

问题

加载因子用于加载值,将其视为税,因此0.02表示“加载量为值的2%”。从查询返回Value时,我还需要计算加载此值的数量。典型的查询可能看起来像

SELECT
{
 [Measures].[Value] 
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube

这将返回2行,正如您通过与上面的数据进行比较可以看到它正确地对成员进行求和:

Scheme   | Value
=================
Scheme X | 3000.0
Scheme Y | 7000.0

现在,如果我尝试计算该查询中的加载因子,那么一切都会出错 - 我将演示。鉴于以下查询:

WITH MEMBER [Measures].[Loading Value]
AS
(
   [Measures].[Value] * [Measures].[Loading Factor]
)
SELECT
{
 [Measures].[Value] ,
 [Measures].[Loading Value]
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube

我得到了结果

Scheme   | Value  | Loading Value
=================================
Scheme X | 3000.0 | 120.0
Scheme Y | 7000.0 | 280.0

基本上,正在发生的是它将我的加载因子相加,然后将其乘以我的值的总和(上面的第一行应该是1000 * 0.02 + 2000 * 0.02 = 60。而是计算3000 * 0.04 = 120)。< / p>

这当然是一个人为的例子,我的实际结构有点复杂 - 但我认为这证明了这个问题。我的印象是上面例子中的计算成员应该逐行发生,而不是在我的Value度量的聚合结束时。

感谢您的回复。

3 个答案:

答案 0 :(得分:0)

你的[测量]。[加载因子] - 如何设置,是SUM?

如果我记得,计算成员通常按照返回的行完成 - 除非您另行指定。

如果您想要一个示例,请查看货币转换向导输出 - 这使用LEAVES命令执行类似操作 - 您需要在MDX脚本中执行此操作作为SCOPE命令。

根据您的描述,代码可能类似于:

CREATE MEMBER [Measures].[Loading Value] AS NULL

Scope( { [Measures].[Loading Value] } );   

    Scope( Leaves([Valuation]) );                                         

            This = [Measures].[Value] * [Measures].[Loading Factor]                                  
            Format_String(This) = "#,##0.00;-#,##0.00";                                                                                

    End Scope;   
End Scope;  

答案 1 :(得分:0)

我不确定我是否完全遵循您的示例,但您可以尝试使用SOLVE_ORDER和SCOPE_ISOLATION来操纵计算的顺序。

例如,

 WITH
 MEMBER [Measures].[Custom Calculation] AS
   '([Measures].[Sales Count] - [Measures].[Unit Returns])',
   SOLVE_ORDER = 65535, SCOPE_ISOLATION = CUBE
 SELECT
 {[Measures].[Custom Calculation]} ON COLUMNS,
 NON EMPTY [Time].[YQMD].[Day].AllMembers ON ROWS
 FROM [Waremart]

答案 2 :(得分:0)

这个结果非常简单。

WITH MEMBER [Measures].[Loading Value]
AS
(
   [Measures].[Value] * [Measures].[Loading Factor]
)
WITH MEMBER [Measures].[Total Loading Value]
AS
SUM (
  EXISTING [Valuation].[Id].[Id],
  [Measures].[Loading Value]
)
SELECT
{
 [Measures].[Value] ,
 [Measures].[Measures].[Total Loading Value]
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube