1

我对 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 属性的 Valuation 维度。还有一个带有 Measure 组 ValuationValue 的多维数据集,其中包含 Value 度量,以及一个包含 Loading Factor 的 Valuation 度量组,如下所示:

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

问题

Loading factor是用来加载Value的,把它想象成税,所以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)。

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

感谢您的任何回复。

4

3 回答 3

0

您的 [Measures].[Loading Factor] - 那是如何设置的,它是 SUM 吗?

如果我记得的话,计算的成员通常是按照返回的行来完成的——除非你另有说明。

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

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

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;  
于 2010-10-29T12:05:06.757 回答
0

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

例如,

和
 成员 [措施].[自定义计算] AS
   '([Measures].[Sales Count] - [Measures].[Unit Returns])',
   SOLVE_ORDER = 65535,SCOPE_ISOLATION = CUBE
 选择
 {[Measures].[Custom Calculation]} 在列上,
 非空 [Time].[YQMD].[Day].AllMembers ON ROWS
 来自 [Waremart]
于 2010-11-02T02:17:32.597 回答
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
于 2010-11-02T15:43:05.780 回答