2014-10-10 65 views
1

我的任务是将当前在我们的报告中使用的T-SQL代码替换为MDX的等效代码。我有T-SQL经验,但不MDX减去一组中的每个成员的计算值-MDX

我目前停留在以下问题:

  • 我们店的名单和他们的损失销售的百分比。
  • 将每个商店的销售损失百分比与基准数据进行比较以作进一步分析。
  • 我需要将最高四分位数的最低失销率百分比作为基准数字,例如,如果我们在最高四分位数中有三家商店,百分比值为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

你很近。 我会认为

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度量的定义中,您可以从Lost Sales Conversion Rate SSO中减去新定义的度量TopQPer。后者将使用当前的[Network].[Centre Id]从每个单元格中的行标题中进行评估,而TopQPer(作为此层次结构的当前上下文在其定义中被覆盖)将在所有中心ID中保持不变。

最后,请注意,我使用了[Network].[Centre Id].[Centre Id].Members而不是[Network].[Centre Id].Members,因为您使用了它。不同的是,我的版本不包括All构件,因为它使用的Centre Id级别的成员,而你包括它,因为它使用Centre Id层次,其中,假设这是一个标准的属性层次结构的成员,由All级别的All成员和Centre Id级别的所有底层成员组成。我假设你不想在计算前25%的成员中包括All成员,但只包含单个中心。如你所见,我多次提到了一些对理解MDX至关重要的概念:数据类型(成员,元组,集合,级别,层次结构)和上下文。

+0

@frankPI你只用一个参数在第一个自定义度量中使用'TAIL' - 这个函数只用一个参数做什么? – whytheq 2014-10-11 13:39:57

+0

infact是'TopPercent'提供排序的数据为什么使用'TAIL' - 不是'.Item(0).Item(0)'足够吗? – whytheq 2014-10-11 13:41:33

+1

@whytheq正如Tail的文档(http://msdn.microsoft.com/en-us/library/ms146056.aspx)所述,带有一个参数的Tail等价于'Tail(,1)'。由于Item(0)返回该集合的第一个元组,而我们需要最后一个元组,所以我们不能忽略它。然而,我们可以使用'TopPercent(...)。Item(TopPercent(...)。Count - 1).Item(0)'。但是,我们会重复两次TopPercent表达式(或者为它引入一个命名集合)。不过,我不确定这是否会在清晰度或表现上有所提升。 – FrankPl 2014-10-13 12:22:46