设为首页 收藏本站
查看: 1312|回复: 0

[经验分享] 深入了解SQL Server 2008的分析服务

[复制链接]

尚未签到

发表于 2018-10-14 07:13:22 | 显示全部楼层 |阅读模式
  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 中,我们需要怎么样编写呢?像这样:
DSC0000.gif

  虽然嵌套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财年第一个季度的运算结果。我们将查询修改为:

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

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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-621272-1-1.html 上篇帖子: SQL Server -- How to fix Database goes to suspect mode 下篇帖子: 安装SQL SERVER 2000遇到的二个问题
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表