Analysis Services 2008(SQL Server配套产品中的一部分)和他的前任产品OLAP Service 7和Analysis Services 2005相比,功能上得到了增强。从很多方面看,这个产品似乎是被重新设计了一番。虽然MDX(multidimensional expressions,多维查询表达式)语言没有发生显著的变化,但是新的版本的确提供了让人振奋的改进。

在这篇文章中,我会讨论一些令人激动的改进,由于他们很可能被应用于解决复杂的商业智能方案中。我将特别讲到CASE语句,子查询和SCOPE函数,他们让MDX变的更加强大和灵活。

MDX脚本支持CASE语句

MDX现在支持CASE语句,和前几个版本中我们不得不使用的嵌套IIF语句相比,他更加容易编码和维护。和其他很多的编程语言相同,CASE原语被用来检验各种条件,从而相应地改变MDX脚本的作业流。CASE语句的语法和Transact-SQL中的同名语句类似,如下:

举个例子,我们能够检查某个hierarchy的每一个level,并且在每一个level上的某个特别的measure进行不同的运算。对Adventure Works样本立方体,下面的语句能够定义转手销售的增长率的运算:

表达式中的第一条语句将data维度中fiscal hierarchy的第一个member的运算之后的member的值配置为“NA”。明显,假如不存在前一期财年,您无法计算增长率;因为您拿不出东西来和这一期的数据进行比较。接着,表达式检查前一个member是否为空值。同样,将这一期的数据和一个空值比较是没有意义的;因此,我们将计算出的member的值配置为NULL。
\ X I;N1|-^J!F/V3W0ITPUB个人空间GO)})X8Z m Y(X0Q6A\s
最后,假如这两个条件都不满足,表示该member既不是第一个member,而且前面的member又不是空值的,这样我们必须为它定义转手销售的增长率。年我们将这一期的销售额减去前一期member的销售额,然后除以前一期的销售额。在前一版的Analysis Services 中,我们需要怎么样编写呢?像这样:

深入了解SQL Server 2008的分析服务_休闲

虽然嵌套IIF语法仍然支持,你可以看出第一种格式远比第二种格式清晰。想想如果我们要检查10种不同的条件而不是2种,会发生什么!我们可以通过下面的查询检查上面两种计算的结果。

SELECT {[date].fiscal.[month].members} ON 1,ITPUB个人空间^0hEnJ#X$wA+F
{measures.[reseller sales amount],
[0Epvx{V2{ [0 measures.[growth in reseller sales amount],
H#?.E4B1O5t0 measures.[growth in reseller sales amount IIF]} ON 0
"? Z0[$z$B\U.Vo0 FROM [adventure works]

如结果所示,两种运算都返回相同的值(我简化了查询结果;全部的结果包括38行)。

Reseller Sales Amount

Growth in reseller sales amount

Growth in reseller sales amount IIF

Jul-01

$489,328.58

(null)

(null)

Aug-01

$1,538,408.31

214.39%

214.39%

Sep-01

$1,165,897.08

-24.21%

-24.21%

Oct-01

$844,721.00

-27.55%

-27.55%

Nov-01

$2,324,135.80

175.14%

175.14%

Dec-01

$1,702,944.54

-26.73%

-26.73%

Jan-02

$713,116.69

-58.12%

-58.12%

Feb-02

$1,900,788.93

166.55%

166.55%

Mar-02

$1,455,280.41

-23.44%

-23.44%

Analysis Services MDX支持子查询

MDX现在支持子查询,让你可以根据子查询返回的结果来改变外部查询的判断条件。每个MDX查询都是在某个多维空间的环境中执行的(有时也被称为子立方体,sub-cube)。如果一个子查询不包括子查询,那么环境就是整个立方体。比如,让我们假设我们要前面的查询只返回2001财年第一个季度的运算结果。我们将查询修改为:

深入了解SQL Server 2008的分析服务_blank_02

注意子查询被放在FROM语句中,相对于Transact-SQL中子查询都放在WHERE语句中。和预期的一样,运算的结果仅限于2001财年的第一个季度。

上面的例子的确比较简单。当然,我们也可以简单的将DESCENDANTS函数放在原来的查询中来限制结果集合。然而,当处理包含多个member的复杂的WHERE语句中,子查询可以很方便的使用。子查询很重要的,因为虽然MDX语句允许在WHERE语句中使用集合(Analysis Services 2005中另一项收到欢迎的改进),但它仅仅允许每个hierarchy有一个member。例如,我们可以修改下面的查询将输出限制为发生在Australia和Canada的销售:

深入了解SQL Server 2008的分析服务_产品_03

输出结果类似于:

在Analysis Services 的以前版本中,能够完成相似功能的唯一的方法是创建一个命名集合并且使用AGGREGATE函数。不幸的是AGGREGATE函数受到很多限制,尤其是它的性能问题。