【问题标题】:SSAS dealing with non linked data处理非链接数据的 SSAS
【发布时间】:2016-07-12 10:43:05
【问题描述】:

我正在尝试将预测数据与多维数据集中的销售数据进行比较。有时我们有一个没有实际销售的预测,有时我们有一个没有预测的销售。如果一个或另一个不存在,如何只显示 0%?这是我当前的代码...绿线没问题,因为它显示 0%,其中一个金额不存在。我希望它对红色圆圈的那些做同样的事情。

CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS IIF([Measures].[Sales Line Amount TCUSD SF] <> 0 OR [Measures].[F Amount] <> 0, 1-ABS(DIVIDE(([Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]) , [Measures].[F Amount])), NULL),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast'  ; 

编辑 - 如果两个度量值都不存在,它们都将为空且不会显示。所以我也不希望显示百分比,我只想在其中一个数量不为 0 时进行计算。如果 f 数量为 0 并且如最后所示有销售,则预测准确性不应显示为 100% img...这是最后一件事要纠正...

【问题讨论】:

  • 1-ABS(DIVIDE(([Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]) , [Measures].[F Amount])) 返回 0 时返回 0.00%。遇到 NULL 值时返回空白。这有什么问题?
  • @BeanFrog - 他不能。有实际的“0”数据。
  • 我不想要空白。如果其中任何一个金额不存在,我想显示 0%。如果我将 NULL 更改为 0,它将用 0 填充所有空白空间,并且 SSAS 将显示所有行,无论是否有度量
  • 好的,让我直截了当地说 - 当任何一个值都不存在时,你想要一个“0.00%”吗?如果两个值都存在但表达式 1-ABS(DIVIDE(([Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]) , [Measures].[F Amount])) 返回 0 怎么办?如果这两个值都不存在,你想要什么?
  • 是的,如果存在或不存在,我想要 0%。如果两者都存在并且 calc 返回 0 那很好。如果两个值都不存在,则显示 0%

标签: sql-server sql-server-2012 ssas mdx ssas-2012


【解决方案1】:

我更喜欢ISEMPTY的安全:

 CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS 
 IIF(
     NOT ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
     OR 
     NOT ISEMPTY([Measures].[F Amount])
   , 1-ABS(DIVIDE(
             [Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]
            ,[Measures].[F Amount]
            )
          )
   ,NULL
  ),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast' ; 

稍微复杂一点:

 CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS 
 IIF(
     ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
     AND 
     ISEMPTY([Measures].[F Amount])
   , NULL   //<<if both are empty
   , IIF(
       NOT ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
       OR 
       NOT ISEMPTY([Measures].[F Amount])
      ,1-ABS(
          DIVIDE(
            [Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]
            ,[Measures].[F Amount]
          )
         )
      ,0
      )
   ),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast' ; 

【讨论】:

  • 嗨,我不确定你是否正确阅读了这个问题,如果其中一项措施不是 0,我希望计算能够工作我也不想用 0 填充所有措施将带入所有物品,无论是否使用。我想要做的只是为它们在图片中突出显示的空白行添加一个 0
  • 当您说“我只想为空白的行添加一个 0”时,您的意思是“我想要做的只是为它们所在的行添加一个 0”是空白还是 0" ?
  • 嗨,我认为第一个示例会做我想要的,但我无法测试第二个示例,在第二个 IIF 之前出现错误,NOT ISEMPTY 和 NONEMPTY 有什么区别?我得到了不同的结果...
  • (@jhowe woops #1 - 嵌套 IIF 缺少逗号)
  • (@jhowe woops #2 + 嵌套 IIF 缺少括号)
【解决方案2】:

我认为whytheq 的回答大部分都做到了。我认为您唯一需要的是检查两个值是否大于零以返回分数,是的,它将适用于您的 SSAS 模型允许的任何维度。类似以下的内容应该可以满足您的需求:

CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS 
 IIF(
     ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
     AND 
     ISEMPTY([Measures].[F Amount])
   , NULL   //<<if both are empty
   , IIF( 
          //Getting here means, at minimum, one of the measures is not empty
          // Calculate the score only if both values are non equal to zero otherwise default to zero
          [Measures].[F Amount] <> 0 AND
          [Measures].[Sales Line Amount TCUSD SF] <>0 
      ,1-ABS(
          DIVIDE(
            [Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]
            ,[Measures].[F Amount]
          )
         )
      ,0
      )
   ),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast' ; 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多