我的任务是将当前用于报告的T-SQL
代码替换为MDX
等效代码。我有使用T-SQL
但不是MDX
我目前遇到了以下问题:
我的问题是 - 如何从商店列表及其销售损失百分比中减去基线数字?我尝试使用以下代码执行此操作:
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
答案 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至关重要的概念:数据类型(成员,元组,集合,级别,层次结构)和上下文。