我有一个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.02ValuationValue表
ValuationId | Value
====================
1 | 1000.0
2 | 2000.0
3 | 3000.0
4 | 4000.0当加载到多维数据集中时,它有一个具有MemberType、Scheme和date属性的赋值维度。和一个多维数据集,该多维数据集具有包含Value度量的度量组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)。
这当然是一个人为的例子,我的实际结构有点复杂-但我认为这说明了问题。我的印象是,上面示例中的计算成员应该逐行出现,而不是在我的值度量的聚合结束时出现。
感谢您的回复。
发布于 2010-11-02 23:43:06
事实证明这并不是一件容易的事。
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-10-29 20:05:07
您的Measures.Loading因子-它是如何设置的,它是一个总和吗?
如果我没记错的话,计算成员通常是按照返回的行执行的-除非您另外指定。
如果您需要一个示例,请查看货币转换向导的输出-这与使用LEAVES命令执行的操作类似-不过,您需要在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; https://stackoverflow.com/questions/4032368
复制相似问题