BI开发之——Mdx基础语法(转至指尖流淌)
Mdx为MultiDimensional Expressions的缩写,多维表达式,是标准的OLAP查询语言。在多数OLAPServer都提供Mdx支持,如Microsoft Sql Server OLAP Services,SAS,Hyperion Essbase等。支持多维对象于数据定义和操作。Mdx很多方面与结构化查询语言(SQL)语法相似,但他不是SQL语言的扩展;事实上,Mdx所提供的一些功能也可由SQL提供,尽管不是那么有效或直观。
如同SQL查询一样,每个Mdx查询都要求有数据请求(select子句)、起始点(From子句)和筛选(where子句)。这些关键字以及其它关键字提供了各种工具,用来从多维数据集析取数据的特定部分。Mdx还提供了可靠的函数集,用来检索的数据进行操作,同时还具有用户定义函数扩展Mdx的能力。
Mdx为多维数据库提供了表达式语查询语法,用于cube数据,并提供了许多强大的分析函数,用于支持常用的OLAP分析。
语法
维度、级别、成员等,一般用唯一名称UniqueName来标示,可以用[]包围name,如果name有空格或者数字开头,必须使用[],否则可以忽略。UniqueName是根据层次结构表示的一种方法。即递归显示出祖先的名称。
维度(Dimension):维度直接用[]包围。比如Product的唯一名称为[Product]或Product。
级别(Level):级别的UniqueName为[维度名称].[级别名称],如[year].[2001],同样,如果没有空格,[]可以省略,如year.[2001]。
成员(Member):成员的UniqueName格式为[维度].(Parent Member UniqueName).[Member Name],如:时间维上的2003年2月份的UniqueName为[2003].[1].[2],中间的1为1季度,因为该维度的结构为年、季、月。
度量(Measure):度量实际上市属于维度维的成员,也就是说度量(Measure)是任何Cube的一个维度。如:度量Unit Sales的UnqiueName为[Measures].[Unit Sales]
UniqueName是OLAP元素内部的表示法,在Mdx查询语言中,可以使用UniqueName来表示元素。
Mdx还提供模糊和其他等价的元素的表示方式:
<1>省略维度名表示级别,如果一个维度的级别名在整个Cube中是唯一的,那么可以省略维度名来查询级别。如Product.[Product Family]可以写成[Product Family]
<2>省略维度名称表示成员。如果省略维度名,可以标示该维度最高级别的成员,如[Time].[2000]可以写成[2000],[Measures].[Unit Sales]可以写成[Unit Sales]。
<3>成员挂在级别下,即成员不一定要写成[维度].(Parent Member UniqueName).[Member Name],可以写成[维度].[级别].[Member Name],如2000年3月可以写成[Time].[Months].[3]
模糊查询表示法,都基于不会重复的假设,如果有重复的元素,取第一个查找的元素作为查询结果,可能发生错误,因此,建议使用完备的表示法
元组、集合
元组用于定义来自多维数据切片;他是由一个或多个维度的单个成员的有序集合组成。元组内不包含来自同一个维度的多个成员(可以理解为坐标),元组用()包围。
如:
(时间.[下半年])
(时间.[下半年],[产品].[手机].[Nokia])
如果一个元组是由单个维度的成员组成,那么可以不用()包围,即(时间.[下半年])可表示为:时间.[下半年]
集合(Set)是零个、一个或多个元组的有序集合。集合最常用于在Mdx查询中定义轴维度和切片器维度,并且同样可能只具有单个元组或可能在某些情况下为空。在Mdx语法中,元组用花括号{}来构造集合
举例,下面是具有两个元组的集合:
{(时间.[上半年],路线.非陆地.航空),(时间.[下半年],路线.非陆地.海路)}
一个集合可包含同一个元组不止一次的出现。这样也是可以的:
{时间.[下半年],时间.[下半年]}
集合值以元组表示的一组成员组合,或指集合中的元组所代表的单元中的值,视集合使用的上下文而定。
注意:单个元组的集合不等于元组。如{时间.[下半年]}不等于 时间.[下半年]。
在Mdx语法中,很多函数语义中包含元组和集合,作为参数或者返回值。
Mdx基本语法结构
先看看Mdx基本语法结构:
SELECT [axis specification] ON COLUMNS,
[axis specification] ON ROWS
FROM
[cube name]
WHERE
[silcer specification]
1、[axis specification]可以看成是轴的成员选择。
2、[silcer specification]表示切片上的成员,可以看成过滤信息,[silcer specification]可选,如果没有指定,取系统默认的维度成员作为切片
轴维度和切片器维度
当设计多维表达式(Mdx)查询时,应用程序一般查看多维数据集并将维度集合划分为两个子集:
1、轴维度,为多个成员检索数据的维度
2、切片器维度,为单个成员检索数据的维度。
因为轴维度和切片器维度都从要查询的多维数据集的多个维度构造,所以用这些术语将要查询的多维数据集使用的维度与在由Mdx查询返回的多维数据集中创建的维度区分开。
例如:
假定存在名为TestCube的多维数据集,具有两个名为Route和Time的简单维度。因为多维数据集的度量值是Measures维度的一部分,所以该多维数据集总共有三个维度。查询要提供一个矩阵,可以在该矩阵内跨路线和时间比较Packages度量值
在下面的Mdx查询实例中,Route和Time维度用作轴维度,Measures维度用作切片器维度。Members函数表明要用于构造集合的维度或级别的成员,而不必再Mdx查询中显示声明给定维度或级别的各个成员。
SELECT
{Route.nonground.Members} ON COLUMNS
{Time.[1st half].Members} ON ROWS
FROM
TestCube
WHERE ([Mesures].[Packages])
指定维度的内容:
轴维度决定多维结果结果集的边缘。多维表达式(Mdx)使用Select子句通过将集合指派到特定轴来指定轴维度。
在下面的语法示例中,每个<axis_specification>值定义一个轴维度。数据集中轴的个数等于多维表达式(Mdx)查询中<axis_specification>值的个数。Mdx查询最多可以支持128个指定轴,但几乎没有Mdx查询会用到5个以上的轴。
<axis_specification>语法可分解为:
<axis_specification>::=<set> ON <axis_name>
<axis_name>::=COLUMNS|ROWS
轴维度上的只能接受集合<set>,如果是手动指定成员集合,必须用{}包围,如果使用Mdx集合函数,则不需要用{}包围,因为集合函数返回值为集合。一个轴维度上可以包含几个维度,如:
SELECT
{
[Measures].[Sales_Dollars], [Measures].[Sales_Units],
[Measures].[Sales_Units_max]
}
ON
columns,
CrossJoin(
{
[State].[Canada], [State].[Mexico], [State].[USA]
},
{
[Product].[Bread], [Product].[Dairy], [Product].[Meat]
}
) ON rows
FROM
sales
WHERE
([Time].[All Time], [Employee].[All Employee])
Columns轴上是手工指定成员元组集合,用{}包围,Rows轴使用集合函数CrossJoin,该函数返回两个集合的交集,Rows轴上包含两个维度State和Product。
指定切片器维度的内容
切片器维度筛选器多维数据,可以通过将切片器维度包含在多维表达式(Mdx)查询的Where子句来限制所返回的数据。
假定未显示指派给轴的维度是切片器维度,并用其默认成员进行筛选。则默认成员为最高级别的的第一个成员。
切片器维度还可通过Mdx语法的Where子句进行显示指定。Where子句的语法可分解为:
[WHERE [<silcer_specification>]]
切片器维度只可接受评估为单个元组的表示式。如下例所示:
WHERE ([Time].[1st half],[Route].[nonground])
BI开发之——Mdx基础语法(转至指尖流淌)的更多相关文章
- BI开发之——Mdx基础语法(2)(转至指尖流淌)
结合webcast中老师的讲解,现在把基础语法应用通过几个案例应用如下: 一.维度的概念 上图中一个维度(Dimension):Region 改为度下有四个级别(Levels):country.pro ...
- SQL点滴17—使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
原文:SQL点滴17-使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识 在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息 ...
- JSP开发中的基础语法
JSP 语法 JSP开发中的基础语法. 脚本程序 脚本程序可以包含任意量的Java语句.变量.方法或表达式,只要它们在脚本语言中是有效的. 脚本程序的语法格式: <% 代码片段 %> 或者 ...
- openresty开发系列15--lua基础语法4表table和运算符
openresty开发系列15--lua基础语法4表table和运算符 lua中的表table 一)table (表)Table 类型实现了一种抽象的"关联数组".即可用作数组,也 ...
- openresty开发系列14--lua基础语法3函数
openresty开发系列14--lua基础语法3函数 一)function (函数) 有名函数: optional_function_scope function function_name( ar ...
- openresty开发系列13--lua基础语法2常用数据类型介绍
openresty开发系列13--lua基础语法2常用数据类型介绍 一)boolean(布尔)布尔类型,可选值 true/false: Lua 中 nil 和 false 为"假" ...
- Java 教程(开发环境配置+基础语法)
Java 开发环境配置 在本章节中我们将为大家介绍如何搭建Java开发环境. window系统安装java 下载JDK 首先我们需要下载java开发工具包JDK,下载地址:http://www.ora ...
- HTML 网页开发、CSS 基础语法——二.互联网原理
1. 互联网的运行过程 ①用户通过输入网址,发送一个HTTP请求到服务器中去,服务器里面存储了程序员上传的所有网页文件. ② 服务器一旦接收到请求,就会将我们所有的相关网页文件,回传到客户端,通过HT ...
- SQL使用数据库引擎存储过程,系统视图查询,DBA,BI开发人员必备基础知识
在开发过程中会遇到需要弄清楚这个数据库什么时候建的,这个数据库中有多少表,这个存储过程长的什么样子等等信息,今天把自己工作过程中经常用到的一些数据库引擎存储过程,系统视图等等总结一下以备不时之用.下面 ...
随机推荐
- Myeclipse2013下载,安装,破解,介绍(CSDN首发)
MyEclipse 2013新特性 根据官方最新消息,MyEclipse 2013已经正式发布!MyEclipse 2013支持HTML5.JQuery和主流的Javascript 库. 随着MyEc ...
- PHP XML Parser函数
PHP XML Parser 函数 PHP XML Parser 简介 XML 函数允许您解析 XML 文档,但无法对其进行验证. XML 是一种用于标准结构化文档交换的数据格式.您可以在我们的 XM ...
- 对象 get和set方法
1.用途 用户定义的对象定义 getter 和 setter 以支持新增的属性. 示例:obj创建一个伪属性latest,它会返回log数组的最后一个元素. var obj = { log: ['ex ...
- element-ui 源码学习
https://athena0304.github.io/element-analysis/ 1.模板字符串实现字符串拼接 typeClass() { return `el-alert--${ thi ...
- 基于Unity3D云人脸监測技术
笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师.CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:<手把手教你架构3D游戏引擎>电子工业出版社和<Unity3D ...
- 理解HTTP/304响应
理解HTTP/304响应 原文:http://www.telerik.com/automated-testing-tools/blog/eric-lawrence/12-11-06/understan ...
- PHP-Windows下搭建Nginx+PHP环境
项目中光用Nginx了, 由于有运维人员, 很少搭建Nginx服务器, 开发也就用用Apache, 搭过几次Nginx也忘的快, 每次都去翻别人博客, 今天重搭特此记录, 装前最好了解下FastCGI ...
- STL中map错误用法一例
[GBK]0G's fans( me ) 13:34:26typedef struct _TX_DATA{ int len; unsigned char buff[0x100]; } TX_DATA, ...
- ansible 提示安装sshpass
之前用ansible一直用的root身份.机器之间又早早的做好了ssh信任.所以一直也没有出现什么问题.今天想想自己不能这么浪了,还是用回普通用户吧: 然而马上就遇到了第一个问题,ansible提示安 ...
- C函数返回字符串
#include "stdio.h" #define KEY 5; int main() { char password[50] = "123456"; enc ...