【MDX学习笔记二】处理MDX
墨初 知识笔记 120阅读
本文中的边界条件来自《MDX Solutions with Microsoft SQL.Server Analysis Services 2005 and Hyperion Essbase 2nd Edition》这本书。写MDX的时候有各种各样的边界条件,比如:成员不存在,被0除,或者其中一部分不存在于cube和dimension等等。本文总结了如何应对这些情况。以下MDX语句可以在SSAS的示例库中运行:Adventure Works。Member不存在的情况y :《泰晤士报新罗马》;MSO-Hansi-font-family : ' Times New Roman ' '在使用成员的某些函数时(如:Lag、Lead、ParalledPeriod等。),我们经常需要获取一个相对于当前会员的会员(比如上一个会员,父级会员,或者去年同期的会员等。).但是,由于维度的成员和等级制度是有限的,这种相对的成员
宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">有时并不存在。在这种情况下,我们可以用IIF判断这个Member是否为Null来解决这个问题(z)。比方说,计算过去6个月的平均销售额。IIF (
[Date].[Calendar].CurrentMember.Lag(5) IS NULL,
NULL,
Avg (
{[Date].[Calendar].CurrentMember.Lag(5): [Date].[Calendar].CurrentMember},
[Measures].[Internet Sales Amount]
)
), FORMAT_STRING="Currency"
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Last 6 Month Average Sales Amount]} ON 0,
{[Date].[Calendar].[Month].Members} ON 1
FROM [Adventure Works]
这里需要注意的是如果 Cell(也就是Turple)不存在也会发生和Member不存在的相同的问题,其实如果Member不存在,Cell是一定不存在的,所以“Member不存在的情况”也可以被看作是“Cell不存在的情况”。

Level错误的情况
有的时候,Axis中的Set包含了位于不同Level的Member,而且每个Level中对于Member的处理方式不同,这种情况下的处理也要小心。比方说,在计算每种产品和其所属SubCategory,Category的销售量的时候,对于产品我们需要显示其标准价格(List Price),我们可以象下面这样来写。

IIF (
[Product].[Product Categories].CurrentMember.Level IS [Product].[Product Categories].[Product Name],
[Product].[Product Categories].CurrentMember.Properties("List Price"),
NULL
)
SELECT
{[Measures].[Internet Sales Amount],[Measures].[Product List Price]} ON 0,
{DESCENDANTS([Product].[Product Categories].[All], [Product].[Product Categories].[Product Name], SELF_AND_BEFORE )} ON 1
FROM [Adventure Works]
被0除的情况
表达式出现0为除数的情况有两种:
1)Member, Cell(也就是Turple)不存在
SSAS中,如果Member, Cell不存在,其返回的值是0。比如:统计每个月每种产品的销售额时,但是有可能在某个月份某个产品由于没有卖出一个。这种情况下,上文已有说明。
2)Cell统计的值为0
比如:统计每个月份占所处季度利润百分比的时候,有可能该季度的利润为0。
无论是那种情况,对于被0除你可以用判断表达式是否为0来处理,像下面这样计算同期比:
IIF (
(
[Measures].[Internet Sales Amount],
ParallelPeriod(
[Date].[Calendar].[Calendar Year],
1,
[Date].[Calendar].CurrentMember
)
) = 0,
NULL,
[Measures].[Internet Sales Amount]/
(
[Measures].[Internet Sales Amount],
ParallelPeriod(
[Date].[Calendar].[Calendar Year],
1,
[Date].[Calendar].CurrentMember
)
) - 1
), FORMAT_STRING="Percent"
SELECT
{[Measures].[Internet Sales Amount], [Measures].[Same Period Ratio]} ON 0,
NON EMPTY{DESCENDANTS([Date].[Calendar].[All Periods], [Date].[Calendar].[Month], SELF)} ON 1
FROM [Adventure Works]