Ssas MDX计算的进阶顺序错误

Ssas MDX计算的进阶顺序错误,ssas,mdx,olap-cube,Ssas,Mdx,Olap Cube,我对MDX查询有一个问题,我认为它可以归结为计算聚合和计算成员之间的优先顺序 让我从基础数据开始,它围绕着一个估值(有一个日期,还有一些其他数据,比如成员类型、方案——对于这个问题来说至关重要的是一个加载因子)和一个相关的值 数据 估价表 Id | Valuation Date | Member Type | Scheme | Loading Factor ============================================================= 1 | 2

我对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
估价价值表

ValuationId | Value
====================
1           | 1000.0
2           | 2000.0
3           | 3000.0
4           | 4000.0
当加载到多维数据集中时,它有一个带有属性MemberType、Scheme和date的估价维度。以及具有度量值组ValuationValue(包含值度量)的立方体,以及包含加载因子的度量值组,如下所示:

Cube
 -Measure Groups
  - Valuation
    |_Loading Factor
  - ValuationValue
    |_Value
 - Dimensions
  - Valuation
    |_MemberType
    |_Scheme
    |_Date
问题 加载因子用于加载值,将其视为一种税,因此0.02表示“加载量为值的2%”。当从查询返回值时,我还需要计算加载该值的数量。典型的查询可能如下所示

SELECT
{
 [Measures].[Value] 
} ON 0,
[Valuation].[Scheme] ON 1
FROM Cube
这将返回2行,如您所见,通过与上面的数据进行比较,它将跨memberType正确求和:

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

这当然是一个人为的例子,我的实际结构有点复杂,但我认为这说明了问题所在。我的印象是,上述示例中的计算成员应在逐行基础上出现,而不是在我的价值度量加总结束时出现


感谢您的回复。

您的[度量].[加载因子]-这是如何设置的,是一个总和吗

如果我记得的话,计算成员通常是根据返回的行进行的-除非您另有指定

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

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

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;  

我不确定我是否完全遵循了您的示例,但您可以尝试使用SOLVE_顺序和SCOPE_隔离来操纵计算顺序

比如说,

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] 具有 成员[度量][自定义计算]为 “([Measures].[Sales Count]-[Measures].[Unit Returns])”, 求解顺序=65535,范围=多维数据集 挑选 列上的{[Measures].[Custom Calculation]}, 非空[Time].[YQMD].[Day]。行上的所有成员 来自[战争艺术]
这件事原来并不容易

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