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