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

从集合的每个成员中减去计算值-MDX,mdx,Mdx,我的任务是用它的MDX等价物替换我们报告中当前使用的一些T-SQL代码。我有T-SQL的经验,但没有MDX 我目前遇到以下问题: 我们有一个商店的名单和他们的销售损失百分比 将每个商店的销售损失百分比与基线数字进行比较,以便进一步分析 我需要将前四分位的最低销售损失百分比值作为基线数字,例如,如果我们在前四分位有3家门店,百分比值为55,50,45,我需要使用45作为基线数字 基线数字是动态的,将根据所有门店的表现而变化 我的问题是-我如何从商店列表中减去基线数字及其损失销售百分比?我已尝试

我的任务是用它的
MDX
等价物替换我们报告中当前使用的一些
T-SQL
代码。我有
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
你很接近。 我认为

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
)返回一个集合时,我通过两次应用
项(0)
将该单个元素集合转换为一个成员。这实际上是两种不同的方法:第一种方法应用于集合,传递其第一个元组;第二种方法应用于元组,返回其第一个成员

差异
度量的定义中,您可以从
损失销售转化率SSO
中减去新定义的度量
TopQPer
。后者将使用每个单元格中行标题中的当前
[Network].[center Id]
,而
TopQPer
,因为此层次结构的当前上下文在其定义中被覆盖,所以在所有中心Id中都是恒定的

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


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

@frankPI您在第一个自定义度量中使用的
TAIL
只有一个参数-这个函数只使用一个arg做什么?事实上是
TopPercent
提供排序的数据为什么使用
TAIL
根本不是
。项(0)。项(0)
足够吗?@whytheq正如TAIL()的文档所述,带有一个参数的Tail相当于
Tail(,1)
。由于项(0)返回集合的第一个元组,而我们需要最后一个元组,因此不能忽略它。但是,我们可以使用
TopPercent(…).Item(TopPercent(…).Count-1)。Item(0)
。但是,我们需要重复两次
TopPercent
表达式(或者为它引入一个命名集)。不过,我不确定这是否会提高清晰度或性能。@FrankPI谢谢。我又回来访问了
MDX
(仍然不相信这种语言对我来说会变得很直观……我会继续把头撞到砖墙上,也许有些东西会陷进去!)@FrankPI是我总是低估这种语言的完美例子——认为事情会变得容易,2小时后我仍在挠头: