SSAS MDX 计算成员,多个范围
SSAS MDX Calculated Member, multiple scopes
想象一个维度为 DimA、DimB、DimC 和 DimD 的立方体。
我想要一个仅在根据 DimA 或 DimB 切片时才应计算的计算成员。如果仅针对 DimC 或 DimD 切片,则它应该 return Null。
目前我已经通过使用下面的 3 个计算成员实现了这一点:
Create Member CurrentCube.[Measures].[CalMeasure1] As Null, VISIBLE = 0;
SCOPE([Measures].[CalcMeasure1]);
SCOPE ([DimA].[DimA].[DimA]);
This = [Measures].[Camp Index];
END SCOPE;
END SCOPE;
Create Member CurrentCube.[Measures].[CalcMeasure2] As Null, VISIBLE = 0;
SCOPE([Measures].[CalcMeasure2]);
SCOPE ([DimB].[DimB].[DimB]);
This = [Measures].[Camp Index];
CREATE MEMBER CURRENTCUBE.[Measures].[CalcMeasure3]
AS IIF(ISEMPTY([Measures].[CalcMeasure1]),[Measures].[CalcMeasure2],[Measures].[CalcMeasure1]),
VISIBLE = 1 ;
END SCOPE;
END SCOPE;
我必须创建其中的很多,所以理想情况下,我想用一个小节来做,而不是 3 个单独的小节。我试过创建一个嵌套范围。我还尝试将两个维度层次结构放在一个范围内。然而,这些方法都不起作用。这两种方法都需要根据 DimA 和 DimB 对度量进行切片。如果它针对 DimA 或 DimB 进行切片,我需要它才能工作。
注意我上面的代码确实有效,我只是想将它压缩为一个计算成员
编辑:- 预期结果,针对不同的枢轴 table 用法。
DimA Attribute CalcMeasure3
1 1.1
2 1.1
3 8.6
DimB Attribute CalcMeasure3
4 2.1
5 2.1
6 9.6
DimA Attribute DimC Attribute CalcMeasure3
1 A 1.1
2 B 1.1
3 C 8.6
DimB Attribute DimD Attribute CalcMeasure3
4 D 1.1
5 E 1.1
6 F 8.6
DimC Attribute CalcMeasure3
A (Null)
B (Null)
C (Null)
DimD Attribute CalcMeasure3
D (Null)
E (Null)
F (Null)
我的第一个猜测:
Scope([Measures].[Camp Index]);
This = IIF(
[DimC].[DimC].[DimC].CurrentMember is [DimC].[DimC].[All]
and
[DimD].[DimD].[DimD].CurrentMember is [DimD].[DimD].[All]
[Measures].[Camp Index],
NULL
);
End Scope;
这个计算的度量如何,没有范围:
WITH MEMBER [Camp Index] AS
IIF(
not ([DimA].[DimA].CurrentMember is [DimA].[DimA].[All]) or not([DimB].[DimB].CurrentMember is [DimB].[DimB].[All]),
[You Calcuate],
IIF(
not ([DimC].[DimC].CurrentMember is [DimC].[DimC].[All]) or not([DimD].[DimD].CurrentMember is [DimD].[DimD].[All]),
NULL,
[You Calcuate]
),
NULL
)
SELECT
{[Camp Index]} on 0
from [Adventure Works]
想象一个维度为 DimA、DimB、DimC 和 DimD 的立方体。
我想要一个仅在根据 DimA 或 DimB 切片时才应计算的计算成员。如果仅针对 DimC 或 DimD 切片,则它应该 return Null。
目前我已经通过使用下面的 3 个计算成员实现了这一点:
Create Member CurrentCube.[Measures].[CalMeasure1] As Null, VISIBLE = 0;
SCOPE([Measures].[CalcMeasure1]);
SCOPE ([DimA].[DimA].[DimA]);
This = [Measures].[Camp Index];
END SCOPE;
END SCOPE;
Create Member CurrentCube.[Measures].[CalcMeasure2] As Null, VISIBLE = 0;
SCOPE([Measures].[CalcMeasure2]);
SCOPE ([DimB].[DimB].[DimB]);
This = [Measures].[Camp Index];
CREATE MEMBER CURRENTCUBE.[Measures].[CalcMeasure3]
AS IIF(ISEMPTY([Measures].[CalcMeasure1]),[Measures].[CalcMeasure2],[Measures].[CalcMeasure1]),
VISIBLE = 1 ;
END SCOPE;
END SCOPE;
我必须创建其中的很多,所以理想情况下,我想用一个小节来做,而不是 3 个单独的小节。我试过创建一个嵌套范围。我还尝试将两个维度层次结构放在一个范围内。然而,这些方法都不起作用。这两种方法都需要根据 DimA 和 DimB 对度量进行切片。如果它针对 DimA 或 DimB 进行切片,我需要它才能工作。
注意我上面的代码确实有效,我只是想将它压缩为一个计算成员
编辑:- 预期结果,针对不同的枢轴 table 用法。
DimA Attribute CalcMeasure3
1 1.1
2 1.1
3 8.6
DimB Attribute CalcMeasure3
4 2.1
5 2.1
6 9.6
DimA Attribute DimC Attribute CalcMeasure3
1 A 1.1
2 B 1.1
3 C 8.6
DimB Attribute DimD Attribute CalcMeasure3
4 D 1.1
5 E 1.1
6 F 8.6
DimC Attribute CalcMeasure3
A (Null)
B (Null)
C (Null)
DimD Attribute CalcMeasure3
D (Null)
E (Null)
F (Null)
我的第一个猜测:
Scope([Measures].[Camp Index]);
This = IIF(
[DimC].[DimC].[DimC].CurrentMember is [DimC].[DimC].[All]
and
[DimD].[DimD].[DimD].CurrentMember is [DimD].[DimD].[All]
[Measures].[Camp Index],
NULL
);
End Scope;
这个计算的度量如何,没有范围:
WITH MEMBER [Camp Index] AS
IIF(
not ([DimA].[DimA].CurrentMember is [DimA].[DimA].[All]) or not([DimB].[DimB].CurrentMember is [DimB].[DimB].[All]),
[You Calcuate],
IIF(
not ([DimC].[DimC].CurrentMember is [DimC].[DimC].[All]) or not([DimD].[DimD].CurrentMember is [DimD].[DimD].[All]),
NULL,
[You Calcuate]
),
NULL
)
SELECT
{[Camp Index]} on 0
from [Adventure Works]