从集合的每个成员中减去计算值 - MDX

时间:2014-10-10 10:55:45

标签: mdx

我的任务是将当前用于报告的T-SQL代码替换为MDX等效代码。我有使用T-SQL但不是MDX

的经验

我目前遇到了以下问题:

  • 我们有一个商店列表及其销售损失百分比。
  • 将每个商店的销售损失百分比与基准数字进行比较,以便进一步分析。
  • 我需要将最高四分位数的最低销售百分比值作为基准数字,例如,如果我们在前四分位数中有3个商店,百分比值为55,50,45,我需要使用45作为基线图。
  • 基线数字是动态的,将根据所有商店的表现而改变

我的问题是 - 如何从商店列表及其销售损失百分比中减去基线数字?我尝试使用以下代码执行此操作:

WITH Member [Measures].[TopQPer] AS 
  BOTTOMCOUNT(
    TOPPERCENT(
      [Network].[Centre Id].Members, 
      25,
      [Measures].[Lost Sales Conversion Rate SSO]
    ),
    1,
    [Measures].[Lost Sales Conversion Rate SSO]
  )
Member [Measures].[Difference] AS 
  (
    (
      [Network].[Centre Id].Members,
      [Measures].[Lost Sales Conversion Rate SSO]
    ) 
   - [Measures].[TopQPer]
  ), FORMAT_STRING = 'Percent'
SELECT
  [Measures].[Difference] ON Columns,
  [Network].[Centre Id].MEMBERS ON ROWS

1 个答案:

答案 0 :(得分:1)

你很亲密。 我想是

WITH Member [Measures].[TopQPer] AS 
            (Tail(TOPPERCENT([Network].[Centre Id].[Centre Id].Members, 
                             25,
                             [Measures].[Lost Sales Conversion Rate SSO]
                            )
                 ).Item(0).Item(0),
             [Measures].[Lost Sales Conversion Rate SSO]
            )
     Member [Measures].[Difference] AS 
            [Measures].[Lost Sales Conversion Rate SSO] - [Measures].[TopQPer]
           ,FORMAT_STRING = 'Percent'
SELECT
            [Measures].[Difference] ON Columns,
            [Network].[Centre Id].MEMBERS ON ROWS
FROM        [YourCube]

提供您想要的东西。

无需使用Bottomcount(, 1)。使用Tail()代替获取最后一个条目效率更高。由于TopPercent已经提供了已排序的数据,我们确信我们可以采取最后一个条目。

我使用元组作为[Measures].[TopQPer]使用的值。因此,正如Tail(顺便说一句,BottomCount)返回一个集合,我通过两次应用Item(0)将该单个元素集转换为成员。这实际上是两种不同的方法:第一种应用于集合,传递其第一个元组,第二种应用于元组,返回其第一个成员。

Difference指标的定义中,您只需从TopQPer中减去新定义的指标Lost Sales Conversion Rate SSO即可。后者将使用评估它的每个单元格中的行标题中的当前[Network].[Centre Id],而TopQPer,因为此层次结构的当前上下文在其定义中被覆盖,将在所有中心ID中保持不变

最后,请注意我使用的是[Network].[Centre Id].[Centre Id].Members而不是[Network].[Centre Id].Members。不同之处在于,我的版本排除了All成员,因为它使用Centre Id 级别的成员,而您的成员则包含它,因为它使用了{Centre Id成员1}} 层次结构,假设这是一个标准的属性层次结构,由All级别的All成员和{{1}上的所有底层成员组成水平。我假设您不希望将Centre Id成员包括在前25%的计算中,而只包括单个中心。

如您所见,我多次提到了一些对理解MDX至关重要的概念:数据类型(成员,元组,集合,级别,层次结构)和上下文。