我尝试创建一个基于2个不同属性的新计算度量。我可以直接查询数据以查看值是否存在,但是当我创建Calculated Member时,它总是返回null。
这是我到目前为止所做的:
CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
AS sum
(
Filter([Expense].MEMBERS, [Expense].[Amount Category] = "OS"
AND ([Expense].[Account Number] >= 51000
AND [Expense].[Account Number] < 52000))
,
[Measures].[Amount - Expense]
),
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Expense';
最终,我需要多次重复这种相同的模式。一种特殊的会计&#34;类型&#34; (吸收,销售和营销,行政,R&amp; D等)基于类别和一系列帐号的组合。
我尝试了几种Sum,Aggregate,Filter,IIF等组合,但没有运气,值始终为空。
但是,如果我不使用过滤器并只创建一个包含2个值的元组,它确实会给我我期望的数据,如下所示:
CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
AS sum
(
{( [Expense].[Amount Category].&[OS], [Expense].[Account Number].&[51400] )}
,
[Measures].[Amount - Expense]
),
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Expense';
但是,我需要指定多个帐号,而不只是一个。
答案 0 :(得分:2)
通常,只有在需要根据某个度量值(例如,销售额> 10.000的所有销售订单)过滤事实表时,才应使用FILTER
函数。它不打算根据维度属性过滤成员(尽管它可能有效,但性能可能会受到影响)。
如果要按一个或多个维度属性的成员进行过滤,请使用元组和集合来表示过滤:
CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
AS
Sum(
{[Expense].[Account Number].&[51000]:[Expense].[Account Number].&[52000].lag(1)} *
[Expense].[Amount Category].&[OS],
[Measures].[Amount - Expense]
),
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Expense';
在这里,我使用范围运算符:
来构造一个由大于或等于51000且小于52000的所有[Account Number]
成员组成的集合。然后我交叉加入{{1}这个设置带有相关的*
属性,以获得我想要衡量的相关成员集。
请注意,这仅适用于您的费用维度中具有帐号51000和52000的成员(请参阅注释)。
完全不同的方法是在ETL过程中执行此逻辑。例如,您可以拥有一个帐户编号范围表,该表格映射到特定会计类型(吸收,销售和营销等)。然后,您可以向Expense维度添加新属性,保存每个帐户的记帐类型,并使用动态SQL和上述映射表填充它。
答案 1 :(得分:1)
我不接近多维数据集脚本,但您不需要通过currentmember
函数创建一些上下文,并返回一些值以对不等运算符进行正确评估(例如>
)通过使用membervalue
函数?
CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
AS sum
(
[Expense].[Amount Category].&[OS]
*
Filter(
[Expense].[Account Number].MEMBERS,
[Expense].[Account Number].currentmember.membervalue >= 51000
AND
[Expense].[Account Number].currentmember.membervalue < 52000
)
,
[Measures].[Amount - Expense]
),
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Expense';
修改
Dan使用了范围运算符:
。请确保您的层次结构已正确排序,并且您使用此运算符的成员实际存在。如果它们不存在,那么它们将被评估为null
:
针对AdvWks
多维数据集:
SELECT
{} ON 0
,{
[Date].[Calendar].[Month].&[2008]&[4]
:
[Date].[Calendar].[Month].&[2009]&[2]
} ON 1
FROM [Adventure Works];
返回以下内容:
如果立方体中不存在左手成员,那么它将被评估为null
,因此在那一侧开放结束:
SELECT
{} ON 0
,{
[Date].[Calendar].[Month].&[2008]&[4]
:
[Date].[Calendar].[Month].&[1066]&[2] //<<year 1066 obviously not in our cube
} ON 1
FROM [Adventure Works];
返回: