关于MDX

MDX (Multi Dimensional eXpression language) 是非常强大的工具,可以将你的多维数据库/cube 发挥到极致. 本文会覆盖MDX基础,并且希望能使你对MDX查询语法,MDX的强大原因,以及如何在你的B.I. 方案中使用MDX进行计算 有充分的认识 .

MSDN 上的定义, MDX的目的就是为了访问多维数据更方便 . 用MDX来查看各种类别(tegories)和聚合(aggregated)的数据再合适不过.  你可能会有这样的疑问,”为什么不直接写个SQL存储过程来查询数据仓库? 我可以从cube获得的数据同样也可以从数据仓库获得!”. 虽然这是实话,但你想一下,你手上有个报表需求,需要计算实际销售(Actual Sales),销售目标(Sales Goals) 以及销售周期(Prior Period Sales). 然后以销售区域(Sales Region), 销售单位(Stores), 年月进行分组. 编写一个存储过程从数据仓库抽取需要的数据,数据量会很大而且散乱,甚至数据仓库没有针对聚合数据报表优化的话,存储的执行效率也会非常地下. 而cube存储的是数据聚合后的结果, MDX查通过多个维度查询聚合(比如区域,销售单位,月份,等)数据要快速高效很多.  简而言之,MDX可以让你用很少的代码来构建及其复杂的查询和报表.不仅仅是查询和报表更容易的创建,他们的执行速度也比直接用SQL查询块的多.

接下来,让我们先回顾下一些术语,在我们编写第一个MDX查询之前必须了解他们.

Basic Terms:

Cube: 一个cube是建立在表格和视图的度量(measures), 事实(facts), 还有维度( dimensions)的集合, 通常来自一个数据仓库. 在一个Cube中,几乎存储了每一个度量的聚合和维度组合. 比如在一个cube中销量是一个度量,你肯能随时想通过产品来查看销量数据. 每产品的销售聚合早已存储在Cube中.这就是基于cube的MDX查询要比直接在数据库中用SQL查询块的多的原因.  在下图中, 你看到一个用图形化表示的含有多个轴的cube,包含Time, Product, 还有 Store 维度.注意 Analysis Services cube指的不是一个立方体. 术语cube 是多维数据库(multidimensional database)的工业标准称呼.

Dimension: 维度就是把某一类(角度)的相关数据组织在一起.比如Adventure Works cube有个产品维度 .一个维度可以建立在表格,视图,或者涉及多个表格或视图的SELECT 语句.

Attribute: 属性可以理解为一个维度性质的描述.例如Product维度的一些属性为种类(Category),型号名( Model Name), 产品(Product), 还有款式(Style) (这里只是举些例子).

Measures (Facts): 度量事实,表示可以被聚合的量化数据. Adventure Works 里面的  Reseller Sales 度量组 就包含 Reseller Tax Amount, Reseller Freight Amount, 和 Reseller Order Quantity 度量.这些度量可以通过cube中的维度进行聚合计算. 例如 把销量划分(broken down )为 产品,区域,时间来查看,对终端用户来说可能更有价值. 而度量就可以按照这种方式查看.

Hierarchy: 层级是维度属性的分级结构.层级结构包含多个级别,每个级别又包含多个成员 .下图中是一个层级的图释. 你可以很清楚的看到成员,级别,和层级的构成.

Level: 正如上面提到的,一个层级包含多个级别. 在 Adventure Works cube 中 Fiscal Year 层级由四个级别组成: 最上面的级别是Year,第二个是Quarter, 第三个是Semester, 第四个是 Month, 最后一个级别是 Date.

Member: 成员是级别中的一个值. 比如Adventure Words cube 中的 Fiscal Year 层级的 Month 级别中的成员 March 就是一个值.

Axis: 可以把轴视为维度的一个线性衍生. 轴和维度交错于cube和度量.

MDX查询最多支持128轴. 单只有5个有别名.

  • Rows
  • Columns
  • Pages
  • Chapters
  • Sections

多数 MDX 查询只包含 2 个轴就能把报表搞定了. 另外能一次查看超过2个维度的多维数据库软件并不多.

Tuple: 元组是使用不同维度属性来标示唯一单元的有序组合(A tuple is an ordered collection of dimension attributes that are not from the same dimension that uniquely identify a cell in a cube .这句吃不太准意思..怕有误解所以原文贴上). 在下面的列子中 , 小括号里面的就是元组,由 Data维度的Fiscal Year属性与Sales Reason维度的Sales Reason 属性组合 .

--A tuple
([Date].[Fiscal Year].&[], [Sales Reason].[Sales Reason].&[])

Set: 集合是元组的聚集. 下列集合包含两个元组. 一个集合中的元组的维度必须一致,否则你的查询会报错.就是说,维度必须一样,顺序也必须一样. 集合必须用花括号框起来. 其中的每个元组用小括号框起来.

--A collection of tuples
{
([Date].[Fiscal Year].&[], [Sales Reason].[Sales Reason].&[]),
([Date].[Fiscal Year].&[], [Sales Reason].[Sales Reason].&[])
}

MDX Query Syntax

下图是一条基础的MDX查询语句. 让我们解析一下这个查询的各个部分.

一看到这个查询,你可能觉得很像T-SQL , 不过那也只是部分相似而已.MDX查询语句的功能与T-SQL有很大差异.

首先是 SELECT 语句. MDX查询中的 Select 语句与SQL 查询的SELECT语句有很大差别. 在T-SQL中, SELECT 语句只能定义查询结果的列布局. 在MDX中SELECT 语句定义多个维度,共达128个不同的轴. 上面的示例中,你可以看到我们指定了日期维度和Fiscal Year 属性,并显示在横(Row)轴上. Internet Order Quanity 度量显示在纵(Column)上.

接着是FROM 语句. FROM 语句指定你要查询的cube. 在 T-SQL中你可以通过FROM 语句连接多个表格,但是MDX没法连接多个cube. 所以想都不要想了.

最后是WHERE 语句. WHERE语句指定一个切片(slicer dimension ) 限制MDX 查询的结果. 例子中我们用了 Product维度Category属性中的一个成员(实际值是Bikes category ) 来限制查询结果.

建立基本的查询

我们一些学了一些必要的属于,并且了解了基本的查询语法. 现在,让我们开始写一些MDX.

Important Note: 本例中所有示例使用的都是 Adventure Works 2008 Analysis Services database, 可以从这里下载here. 装好以后,用BIDS打开Analysis Services 项目(默认地址default in c:\Program Files\Microsoft SQL Server\100\Tools\Samples) . 记得修改数据源连接,然后部署项目.

打开 SQL Server Management Studio. 在弹出的 Connect to Server 对话框中,下拉选择Analysis Services.指定Adventure Works 数据库所在的服务器.

连接后右击 AdventureWorksCube 选择 New Query 然后选 MDX.

现在MDX 查询编辑器窗口已经打开.我们开始写点MDX, 第一个查询非常简单, 它返回Adventure Works cube默认的度量.

SELECT
FROM [ADVENTURE WORKS]
;

结果:

如果你执行了上面的查询,结果只返回了一个数字. 默认情况下什么都没指定那么就返回Cube中默认的度量. 在Adventure Works cube中. 默认的是度量是  Reseller Sales Amount. 这个查询返回了 所有产品,所有时间,所有区域…等等等 ..总之就是Reseller Sales 总和 . 所以除非你指定某个要看的度量.否则就返回默认的度量 Reseller Sales Amount.

如果我要看不懂的度量,那就必须使用Where语句指定一个切片(slicer).

SELECT
FROM [ADVENTURE WORKS]
WHERE [Measures].[Reseller Total Product Cost]
;

结果:

因为我们限定了查询Where语句的查询范围 Reseller Total Product Cost, 所以查询返回Reseller Total Product Cost的总计.

现在让我们指定一些维度,对cube进行切片和分块.

 
SELECT [Date].[Calendar].[Calendar Year] ON COLUMNS,
[Product].[Product Categories].[Category] ON ROWS
FROM [ADVENTURE WORKS]
;

结果:

我们在Columns轴和Row轴上都指定了维度. 因为我们没有指定返回的度量,所以默认还是返回Reseller Sales Amount.

最后一个查询,让我们把所有东西都放上去:

SELECT [Date].[Calendar].[Calendar Year] ON COLUMNS,
[Product].[Product Categories].[Category] ON ROWS
FROM [ADVENTURE WORKS]
WHERE [Measures].[Reseller Total Product Cost]
;

结果:

MDX 书籍

这里有一些值得推荐的MDX书:

MDX Solutions - http://www.amazon.com/MDX-Solutions-Microsoft-Analysis-Services/dp/0471748080/ref=sr_1_2?ie=UTF8&s=books&qid=1284385194&sr=8-2

Microsoft SQL Server 2008 MDX Step by Step - http://www.amazon.com/Microsoft-SQL-Server-2008-Step/dp/0735626189/ref=sr_1_1?s=books&ie=UTF8&qid=1284385251&sr=1-1

Practical MDX Queries - http://www.amazon.com/Practical-MDX-Queries-Microsoft-Analysis/dp/0071713360/ref=sr_1_1?s=books&ie=UTF8&qid=1284385281&sr=1-1

Fast Track to MDX - http://www.amazon.com/Fast-Track-MDX-Mark-Whitehorn/dp/1846281741/ref=sr_1_1?ie=UTF8&s=books&qid=1284477262&sr=8-1

I hope this article has given you a good starting point so that you can begin writing your own MDX queries. Stay on the look out for my part 2 article in which we will cover more advanced MDX functions and queries. As always, feel free to shoot me a message, leave a comment, or email me at dryan@pragmaticworks.com .

原文地址: http://www.bidn.com/articles/mdx-and-dmx/178/mdx-101-introduction-to-mdx

[译]MDX 介绍的更多相关文章

  1. [译]PostCSS介绍

    PostCSS介绍 原文链接:http://www.smashingmagazine.com/2015/12/introduction-to-postcss/ 转自:http://www.zcfy.c ...

  2. [译]CQRS介绍

    以下内容均为看完原文后自己的理解.并非一字一句翻译,会尽量保持原文意思. 什么是 CQRS: CQRS 意思就是命令查询职责分离(Command Query Responsibility Segreg ...

  3. 【转帖】介绍 .NET Standard

    [译]介绍 .NET Standard https://zhuanlan.zhihu.com/p/24267356 跟开发争执过 自己不会写代码 的确不好. 若有任何对翻译的建议,烦请指正 有任何问题 ...

  4. 【转载】MSDN-MDX#001 - 多维表达式 (MDX) 参考

    摘录于MSDN MDX 的一些重要概念 1. MDX 介绍 多维表达式 (MDX) 是用于在 Microsoft SQL Server Analysis Services (SSAS) 中处理和检索多 ...

  5. babel简介——简单介绍与实用(转)

    博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3.babel转译器 4.babel的使用 5.常见的几种babel转译器和插件 6.babel最常见配置选项 7.babe ...

  6. babel如此简单

    凡是看到这个标题点进来的同学,相信对babel都有了一定的了解.babel使用起来很简单,简单到都没有必要写一篇文章去介绍,直接看看官方文档就可以.所以我也在怀疑到底该不该写这篇文章.想来想去还是决定 ...

  7. babel从入门到入门

    babel从入门到入门 来源 http://www.cnblogs.com/gg1234/p/7168750.html 博客讲解内容如下: 1.babel是什么 2.javascript制作规范 3. ...

  8. babel简介

    1.babel是什么 babel官网正中间一行黄色大字写着“babel is a javascript compiler”,翻译一下就是babel是一个javascript转译器.为什么会有babel ...

  9. .NET项目迁移到.NET Core操作指南

    为什么要从.NET迁移到.NET Core? .NET Core提供的特性 .NET Core性能提升 .NET如何迁移到.NET Core? 迁移工作量评估(API兼容性分析) 迁移方案制定 通过类 ...

随机推荐

  1. symfony2-不同bundle的entity的一对多关系

    重点:其实和普通一个bundle中一样,只是把entity地址写全就行. 例子: 表commentone (多方) 表shopone(一方) 在Userbundle中的Commentone实体对应关系

  2. 简单OC程序

       Foundation框架头文件的路径 1> 右击Xcode.app --> 显示包内容 2> Xcode.app/Contents/Developer/Platforms/iP ...

  3. 使用 Java 实现 Comet 风格的 Web 应用

    参考这个: http://www.ibm.com/developerworks/cn/web/wa-cometjava/

  4. 动态更换view类的背景----StateListDrawable的应用

    StateListDrawable可以根据View的不同状态,更换不同的背景 可以应用如EditText,Button等中,以Button为例 系统中默认的按钮被按下的颜色和未点击时的颜色不一样,该种 ...

  5. 浅谈 android-query

    介绍:android-query他是在GitHub上的一个开源轻量级的封装库,它集成了网络 .图片加载等模块,可以应用在android中的一些异步应用以及UI的操纵上,通过使用这个框架,使androi ...

  6. thrift之初体验

    hrift是一个软件框架,用来进行可扩展且跨语言的服务的开发.它结合了功能强大的软件堆栈和代码生成引擎,以构建在 C++, Java, Python, PHP, Ruby, Erlang, Perl, ...

  7. jquery 使用ajax调用c#后台方法

    $.ajax({                         type: "get",                         cache: false,        ...

  8. Eclipse、MyEclipse优化,提高运行速度

    MyEclipse 是公认的优秀的软件开发工具,使用非常广泛.相信很多人在使用的过程中,发现其运行速度比较慢,因为每次操作的背后,它调用了很多的命令,执行了很多操作:但是其中大部分的操作都是非必须的: ...

  9. CodeForces 154B- Colliders

    预处理...由于10^5<2^20..所以每个数的质因子个数最多20个..为了避免重复运算..将素有数的质因子打表出来... 两个数如果互质..那么他们的最大公约数为1..反过来说..两个数如果 ...

  10. STL中主要的算法(一)

    一.replace() 替换算法将指定元素值替换为新值,使用原型例如以下,将迭代器[first,last)中值为old_value的元素所有替换为new_value值. 函数原型: template  ...