Sql server 2012 基于多维属性计算的SSAS成员
我正试图创建一个基于两个不同属性的新计算度量。我可以直接查询数据以查看值是否存在,但是当我创建计算成员时,它总是返回null 以下是我到目前为止的情况:Sql server 2012 基于多维属性计算的SSAS成员,sql-server-2012,ssas,mdx,Sql Server 2012,Ssas,Mdx,我正试图创建一个基于两个不同属性的新计算度量。我可以直接查询数据以查看值是否存在,但是当我创建计算成员时,它总是返回null 以下是我到目前为止的情况: CREATE MEMBER CURRENTCUBE.[Measures].[Absorption] AS sum ( Filter([Expense].MEMBERS, [Expense].[Amount Category] = "OS" AND ([Expense].[Account Number] >
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';
但是,我需要指定多个帐号,而不仅仅是一个。我不接近多维数据集脚本,但您不需要通过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';
返回以下内容:
如果左侧成员在多维数据集中不存在,则其计算结果为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];
返回:
通常,仅当需要根据某些度量值(例如,Sales Amount>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';
这里,我使用了range操作符:构造一个集合,由大于或等于51000且小于52000的所有[Account Number]成员组成。然后,我将*这个集合与相关的[Amount Category]属性交叉连接,以获得我想要对度量值求和的相关成员集合
请注意,这仅在您的费用维度中实际有一个帐号为51000和52000的成员时有效请参见备注
一种完全不同的方法是在ETL过程中执行此逻辑。例如,您可以有一个账号范围表,该表映射到特定的会计类型吸收、销售和营销等。。然后,您可以向支出维度添加一个新属性,保存每个帐户的会计类型,并使用动态SQL和前面提到的映射表填充该属性。您有输入错误吗?一个帐号怎么可能大于51000而小于5200?@TabAlleman,是的,谢谢。帐号是一种度量吗?如果是层次结构,[Expense].[Account Number]>=51000由SSAS解释为[Expense].[Account Number].[All],[Measures].CurrentMember>=51000@我没解释清楚。我有一个叫做费用的事实表。到目前为止,我定义的唯一度量是ExpenseAmount列的总和。我将[金额类别]和[账号]视为维度属性。账号不是继承人,它只是5位数账号的列表。谢谢你的建议。我还不太了解mdx的语法。我确实尝试过你的想法,但还是一样,都是空的。谢谢你的提示@whytheqthis可能是错误的。如果该多维数据集中不存在51999,则该多维数据集中的计算结果为null,因此您的对账单将变为[Expense].[Account Number].&[51000]:null,这是非常不同的。日期维度是使用范围运算符的一个非常安全的位置,因为成员资格通常已完成…@whytheq:否,如果未找到成员,将引发错误。您正在考虑StrToMember函数,除非指定了constrained标志,否则该函数的计算结果为null。感谢您编辑您的答案。请测试您的建议,因为没有提出错误。我会补充我的答案。@whytheq证明你是对的。我可以发誓在元组/集合表达式中引用不存在的成员会导致错误,但我必须考虑其他问题。无论如何,我编辑过的答案应该清楚地表明,这只适用于您实际引用已知成员的情况。lol-我在:上周遇到了这个问题-当与日期以外的任何内容一起使用时,肯定会有潜在的危险。此外,如果用户层次结构的顺序不正确,那么它不会失败,但会返回奇怪的答案,如果您觉得慷慨,您可以调整我的答案:……p.s。不错的防守使用滞后
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];
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';