首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >基于多个维度属性计算的SSAS成员

基于多个维度属性计算的SSAS成员
EN

Stack Overflow用户
提问于 2014-12-11 22:28:19
回答 2查看 11K关注 0票数 2

我正在尝试创建一个基于两个不同属性的新计算度量值。我可以直接查询数据以查看值是否存在,但是当我创建计算成员时,它总是返回null。

这是我到目前为止所知道的:

代码语言:javascript
运行
复制
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';     

最终,我需要多次重复相同的模式。一种特殊的会计“类型”(吸收、销售和营销、管理、研发等)基于类别和账号范围的组合。

我已经尝试了Sum,Aggregate,Filter,IIF等的几种组合,但没有成功,值总是空的。

但是,如果我不使用Filter,而只是创建一个包含2个值的元组,它确实会给出我所期望的数据,如下所示:

代码语言:javascript
运行
复制
CREATE MEMBER CURRENTCUBE.[Measures].[Absorption]
 AS sum
(

    {( [Expense].[Amount Category].&[OS], [Expense].[Account Number].&[51400]  )}
    ,

    [Measures].[Amount - Expense]
), 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Expense';  

但是,我需要指定多个帐号,而不仅仅是一个。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-12-15 20:22:21

通常,只有在需要根据某个度量的值(例如,Sales Amount >10.000的所有销售订单)来过滤事实表时,才应该使用FILTER函数。它不打算根据维属性筛选成员(虽然它可能可以工作,但性能可能会受到影响)。

如果要按一个或多个维属性的成员进行筛选,请使用元组和集来表示筛选:

代码语言:javascript
运行
复制
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]成员组成的集合。然后,我将这个集合与相关的[Amount Category]属性进行交叉联接,以获得要对度量求和的相关成员集合。

请注意,只有当您的费用维中确实有帐号为51000和52000的成员时,此操作才有效(请参阅注释)。

另一种完全不同的方法是在ETL流程中执行此逻辑。例如,您可以有一个帐号范围表,该表映射到特定的会计类型(吸收、销售和营销等)。然后,您可以向费用维度添加一个新属性,保存每个帐户的记帐类型,并使用动态SQL和前面提到的映射表填充它。

票数 3
EN

Stack Overflow用户

发布于 2014-12-13 22:20:10

我不会接近多维数据集脚本,但是您是否不需要通过currentmember函数创建一些上下文,并通过使用membervalue函数返回一些值以针对不等式运算符(例如>)进行正确的计算?

代码语言:javascript
运行
复制
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

针对AdvWks多维数据集:

代码语言:javascript
运行
复制
SELECT 
  {} ON 0
 ,{
      [Date].[Calendar].[Month].&[2008]&[4]
    : 
      [Date].[Calendar].[Month].&[2009]&[2]
  } ON 1
FROM [Adventure Works];

返回以下内容:

如果立方中不存在左侧成员,则将其求值为null,并因此在该一侧结束:

代码语言:javascript
运行
复制
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];

返回:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27425178

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档