微软商业智能实战九:SQL和MDX的区别

上一篇文章我们简单聊了SSAS技术,今天我们将从基本概念、BI 语义模型和分析场景来介绍 MDX 与 SQL 的区别。看完本文之后,相信您会更加了解为什么 MDX 比 SQL 加适合复杂分析场景。相信从事过数据分析相关工作的小伙伴,对于SQL都不陌生。在各行各业往往都会有复杂的分析需求,如半累加,多对多,时间窗口分析等,编写SQL语句在处理这些分析场景时就有些捉襟见肘。而这些分析场景的处理使用MDX语法是最合适的。下面我们来一起看一些具体对比分析。

一、MDX 和 SQL 基本概念

1.1、MDX 是什么?

MDX ,多维表达式(Multidimension eXpressions) 是一种 OLAP 多维数据集的查询语言,类似于SQL的数据库查询语言。最初由微软在1997 年作为 OLEDB for OLAP 规范引入,随后集成在 SSAS 技术中。MDX仅仅只是一个微软的规范,并不是一个开放的标准。但是这个规范正在被越来越多的OLAP服务提供商所采用。这正是MDX生命力顽强的体现。

一个基本的MDX Select语句样例如下:

with member [Measures].[DoubleAmount] as '[Measures].[Sales Amount] * 2'

select [Account].[Accounts].Levels(1).AllMembers on columns,

{[Measures].[Sales Amount],  [Measures].[DoubleAmount]} on rows

from [Adventure Works]

where ([Date].[Fiscal].[Fiscal Year].&[2002])

“with” 语句部分;样例中的第1行。该语句用于获取数据前的预处理。在预处理的过程中,我们可以定义各种各样的计算,这些计算包括可命名集合和计算成员。在本样例中,我们定义的是计算成员。

通过分析这个MDX语句样例,我们可以看出MDX语句有以下几个部分:

“select” 语句部分;样例中的第2,3行。该语句用于选择可获取的数据。

“from” 语句部分;样例中的第4行。该语句用来定义我们从哪个数据块获取数据。

“where” 语句部分;样例中的第5行。该语句用来切割数据块,并合计数据。

在这4个部分中,我们可以根据自己的需求写出很复杂的MDX语句以获得相应的数据。

1.2、SQL 是什么?

SQL,结构化查询语言 (Structured Query Language) 是一种用于管理关系型数据库的编程语言,包含 DQL(查询)、DML(增删改)、DDL(定义修改元数据) 和 DCL(权限、事务控制)。SQL的应用范围也非常广,本文为了更好让小伙伴们了解SQL和MDX的区别,本文只涉及两种语言的查询部分的对比。一个基本的SQL Select语句样例如下::

select * from 数据表 where字段名 = 字段值  group by 字段名 order by 字段名 [desc]"。

通过分析这个sql语句样例,我们可以看出SQL语句有以下几个部分:

select返回用指定的条件在一个数据库中查询的结果

WHERE子句筛选出满足条件的行集;

GROUP BY子句对行集中的行做分组合并,使得多个行对应于结果集中的一行;

应用ORDER BY子句对结果集中的行排序。

二、MDX 和 SQL 查询方式的主要区别

2.1、 MDX Select 部分是维度度量或其表达式。

SQL Select 部分是列或列的表达式。

2.2、MDX From部分是多维数据集(Cube),是提前关联并聚合好的数据,查询时不需要指定关联关系。

    SQL From部分是关系表(Table),是一条条的明细记录,查询时需要指定表之间的关联关系。

注意:MDX 和SQL虽然有语法区别,但是它们在很多情况下是可以等同于的,举个例子我们需要查询Adventure Works 公司 2004年不同销售渠道的销售额。

用 MDX 表示为:

SELECT NON EMPTY { [Measures].[Sales Amount] } ON COLUMNS, NON EMPTY { ([Sales Channel].[Sales Channel].[Sales Channel].ALLMEMBERS ) }  ON ROWS FROM  [Adventure Works] WHERE ( [Date].[Fiscal Year].&[2004] )

用 SQL 表示为:

select case when OnlineOrderFlag=1 then 'Internet'  

          else 'Reseller' end  [Sales Channel],sum(LineTotal) [Sales Amount] from [Sales].[SalesOrderDetail]  t1 left join [Sales].[SalesOrderHeader] t2 on t1.SalesOrderID=t2.SalesOrderID where year(t2.OrderDate)='2004'

    group by case when OnlineOrderFlag=1 then 'Internet'  

          else 'Reseller' end

三、BI 语义模型

上一篇文章中我们也提到了目前主流的 BI 产品(Tableau, Power BI,Qlik等)都支持通过 SQL 接口(JDBC/ODBC)连接关系数据库,也支持 MDX 接口(XMLA)连接多维数据库。但 BI 通过两种接口获取到的语义模型有较大的差异下面将具体介绍两者的差异性。下面使用的工具有SE-DWA高效数仓搭建平台和数据分析工具。

3.1、MDX 语义模型包含维度(维度别名),度量(度量别名),维度层级结构等,数据分析师在 BI 端不需要对模型进行业务语义的定义,这样的好处是建模工程师可以在OLAP工具中统一定义业务用户分析时使用的语义模型,而业务在使用 BI 工具分析时无需理解底层表结构,直接使用同步到 BI 工具的维度、度量、层级结构、计算度量等进行分析。

MDX 对复杂分析场景的控制能力比 SQL 更强,对于一些复杂场景如半累加、时间窗口分析等,MDX 都可以通过简单的表达式来处理。而同样的逻辑使用 SQL 就需要使用非常复杂的查询才能实现,有些场景甚至无法简单通过 BI 发送的 SQL 查询来实现。

SE-DWA建立的OLAP模型在Tableau中同步OLAP模型

3.2、SQL 语义模型

数据库包含源表和源列,需要分析师 /业务用户手动定义表的模型关联关系,维度的友好名称,度量的友好名称及聚合类型,层级结构的源列顺序等。这些完成后才能进行正常的业务分析,这样的好处是终端用户可针对分析需求灵活的进行数据建模,但同时也要求用户对底层数据结构有一定的理解。

SE-DWA建立的数仓模型在 Tableau 中基于SQL模式的表进行建模

3.3、MDX实现的复杂分析场景

财务分析,是各行各业中都需要进行分析场景。其中,应收账款年初金额是一个半累加度量,即在时间维度上不具备累加性,但是在其他维度具备累加性。为了方便大家理解小黎子在下面进行模拟应收账款的记录如下,需要获取每年所有客户年初(年的第一月)和年末(年的最后一月)的应收款的总额。

我们按照分析需求,得到的结果应该如下:

如果使用 SQL,查询表达式如下:

如果使用 MDX,需要先定义计算度量(基础度量 [Measuers].[科目余额_本位币期初金额]]=sum(本位币期初金额]),基础度量 [Measuers].[科目余额_本位币期末金额]]=sum(本位币期

末金额])),如下:

科目余额_本位币年初金额=([Measures].[科目余额_本位币期初金额],[维度_日期].[会计期间].[会计期间].&[1])

科目余额_本位币年末金额 = ([Measures].[科目余额_本位币期末金额],[维度_日期].[会计期间].[会计期间].&[12])

MDX 查询表达式为:

select {[Measures].[科目余额_本位币年初金额], [Measures].[科目余额_本位币年末金额 ]} on Columns,  [维度_日期].[会计月份].members on Rows from [SE_财务解决方案_多维数据集]

由上可见在分析场景中MDX 比 SQL 更容易实现。这个场景的复杂度并不高,有些小伙伴可能还是认为SQL更好统计分析。其实,类似的场景还有其他的常见分析场景,比如账户余额分析,仓库的库存分析等。另外,MDX 还能够支持多对多分析场景,这是 SQL 所不支持的。

四、SE-DWA支撑企业部署的BI 语义层

SE-DWA提供了数据仓库的搭建平台可集成市面主流 BI,提供统一的基于大数据的业务语义层。为企业实现企业级业务语义层提供了技术可能性,并可满足更多 SQL 很难满足的复杂分析场景。

SE-DWA中定义日期语义表

SE-BI + SE-DWA OLAP模型 分析大数据场景下产品收入的同比环比

五、总结

MDX 和 SQL 都是在 OLAP 查询中经常使用的语言,主流的 BI 厂商都提供对两种接口的支持。两者的差异在于:

1、MDX 查询对应的是多维视图,而 SQL 对应的是关系视图,在聚合查询的语法上 MDX 要简单许多。

2、MDX 的语义模型更加丰富和业务友好,而 SQL 的语义模型相对简陋,需要后续再定义。

3,MDX 计算表达能力更加丰富,能够更好的支持复杂分析场景。

综上所述,如果业务上有复杂的分析场景需求如半累加,时间窗口分析等,SE-DWA创建的OLAP方案能够帮您轻松处理,从而更好的专注与业务数据的分析。 

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,569评论 4 363
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,499评论 1 294
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,271评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,087评论 0 209
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,474评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,670评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,911评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,636评论 0 202
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,397评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,607评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,093评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,418评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,074评论 3 237
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,092评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,865评论 0 196
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,726评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,627评论 2 270

推荐阅读更多精彩内容