[SQL Server2008]MDX查询语句

在Essbase中使用MDX只能用于查询,尚不能来操作Cube(MS SSAS中可以使用MDX来操作Cube的),所以这里只学习MDX的Select语句。

 

在学习的过程中,我觉得最有难度的地方有两个。

一是,对OLAP多维的理解。如同学习SQL一样,SQL作用的对象是表,表的结构都是二维的,标识行列即可;但是MDX作用的对象是多维数据库,那么就得理解多维数据库的维度,层级,成员,以及如何在多维数据库中定位不同层级的成员。

二是,理解MDX查询语句的结构及术语的含义。学习SQL时,我们常提到表,字段,那么MDX中呢,想必这些术语必须理解,例如:Cube,Slice,Axis,Set,Tuple,Members

我的学习经历是这样的,首先了解MDX语句的特点及功用。

 

“MDX全称是Mutil-Dimensional Expressions,即多为表达式。MDX是一种和SQL类似的语言,它也可以用于查询、计算和定义一些元数据。只不过SQL是基于OLTP的,而MDX是基于OLAP的,也就是说,MDX是对多维数据进行查询的。和其它的OLAP语言不同,MDX并不完全是一种报告形式语言。但用MDX查询出来的结果仍然可以在客户端程序中以表格形式进行展现。MDX和SQL一样,也有很多不同功能的API来支持MDX,最常用到的就是XML API。”

上面的一段话是从网上摘录来的,给MDX做了一个定义。

接下来学习MDX查询语句的结构及组成。

[<with_section>]

SELECT [<axis_specification>

       [, <axis_specification>...]]

[FROM [<cube_specification>]]

[WHERE [<slicer_specification>]]

这个结构就是MDX查询语句的通用结构,从中要理解哪些是关键字以及关键字的顺序,WITH section、Axis、Cube、Slicer的位置。这些都是MDX的语法规定,所以要牢记各自的位置。

 

然后学习的是以上MDX语句结构中各个位置的含义。

<with_section>的位置用于设定自定义的计算。有两种运用,WITH SET…,WITH MEMBER…,在复杂的MDX查询语句中经常被用到。

<axis_specification>的位置用于设定轴。这个轴是反映在MDX语句的输出报表上的。常用的就是列、行、页,如下图所示:

<cube_specification>位置用于指定查询用的Cube,只能指定一个。

<slicer_specification>位置用于指定限制条件,可以是多个限制条件,反映在Cube中称为切片。

到了这一步要学习就是MDX查询语句中每个轴上的内容了。如:Set、Tuple,Member等

Set称为“集合”,类似数学中集合的定义,要求集合内的成员结构必须相同;

Tuple称为“元组”,类似Member,但是特殊的地方是一个Tuple是由一个或多个成员组成,而这些成员来源于不同的维度,每个维度只能出现一次;

Member称为“成员”,就是Cube结构上的最小单位。

注意:Tuple的概念比Set小,一个Set中可以包含多个Tuple。

Tuple使用( )来标记;Set使用{ }来标记;

如果一个Set中有多个Tuple,那么这多个Tuple的组成维度必须相同,且顺序相同。

例如下面的例子就是错误的。

错误01:维度不同

{ ( [Time].[2005], [Measures].[Dollar Sales] ),

   ( [Time].[Feb, 2005],[Product].[Toys] )

}

 

错误02:维度相同,但是顺序变了。

{ ( [Time].[2005], [Measures].[Dollar Sales] ),

( [Measures].[Unit Sales], [Time].[Feb, 2005] )

}

 

错误03:Tuple中出现了同一维度的两个成员

( [Measures].[Unit Sales], [Measures].[Dollar Sales] )

 

学习到这里,我就可以写一些简单的MDX查询语句了。

例如:

SELECT

{[100-10], [100-20]} ON COLUMNS,

{[Qtr1], [Qtr2], [Qtr3], [Qtr4]} ON ROWS

FROM Sample.Basic

 

 

仅仅是简单的MDX查询语句是不够,要写出复杂的查询语句,必须学习MDX的一些函数。

我个人觉得学习这些函数,首先要了解这个函数的返回值是什么,可能是数值,布尔值,集合,元组,成员等;然后再去学习函数的输入参数是什么。完成这两点之后,学习使用MDX函数就会变得很简单。

经常用到的CrossJoin ,Filter, Order等。

学习其他函数请参见Oracle Hyperion Essbase Technical Reference。

最好的学习方法就是把所有的函数都学习一遍,这样以后用到MDX解决问题的时候就可以信手拈来。

 

学习了函数之后,还有一块重要的东西要学习,它是WITH Section.在WITH Section部分可以定义各种复杂的计算,功能十分强大。下面的一个例子就是使用WITH来实现合计。

 

WITH

SET [Top3BevsPerRegion] AS

'Generate ({[Market].children}, Crossjoin ({[Market].Currentmember}, TopCount ([Product].Children, 3, ([Measures].[Sales],[Year]))))'

MEMBER [Product].[Total] AS

'SUM(TopCount ([Product].Children, 3, ([Measures].[Sales],[Year])),[Measures].[Sales])'

SET [TT] AS

'Crossjoin ({[Market].Children},{[Product].[Total]})'

SELECT

{[Year].Children} ON COLUMNS,

Hierarchize({[Top3BevsPerRegion],[TT]}) ON ROWS

FROM Sample.Basic

WHERE ([Scenario].[Actual], [Measures].[Sales])

 

最后呢,当然要学习一下MDX语句执行的顺序是怎样的呢?如下

WITH ...

SELECT [NON EMPTY] ... [HAVING ...] on axis(0),

... on axis(1), ...

FROM ...

WHERE ...

 

1.解析FROM语句,选定查询的Cube;

2.解析WHERE语句,对Cube做切块;

3.解析WITH语句中的命名SETS,执行预定义计算;

4.解析每一个轴(Rows,Columns,.....)上的的Tuples,计算轴上的字段;

5.解析NONEMPTY,在轴的交叉点上计算出结果。

图示:

转载于:https://www.cnblogs.com/weishuai/archive/2010/12/09/1901452.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MDX 中的重要概念 使用成员、元组和集 (MDX) MDX 语法元素 标识符 表达式 使用多维数据集表达式和子多维数据集表达式 使用维度表达式 使用成员表达式 使用元组表达式 使用集表达式 使用标量表达式 使用空值 运算符(MDX 语法) 算术运算符 位运算符 比较运算符 串联运算符 集运算符 一元运算符 赋值运算符 函数(MDX 语法) 使用字符串函数 使用数学函数 使用逻辑函数 使用成员函数 使用元组函数 使用集函数 使用维度函数、层次结构函数和级别函数 使用存储过程 (MDX) 注释(MDX 语法) 保留关键字(MDX 语法) MDX 查询基础知识 基本 MDX 查询 EXISTING 关键字 用查询轴和切片器轴限定查询 指定查询轴的内容 指定切片器轴的内容 在简单示例中使用查询轴和切片器轴 在查询中建立多维数据集上下文 在 MDX 中生成子多维数据集 在 MDX 中生成命名集 创建查询作用域的命名集 创建会话作用域的命名集 在 MDX 中生成计算成员 在 MDX 中生成单元计算 创建和使用属性值 操作数据 修改数据 使用变量和参数 MDX 脚本编写基础知识 基本 MDX 脚本 管理作用域和上下文 错误处理 支持的 MDX MDX 语言参考 MDX 语法约定 MDX 语句参考 MDX 脚本编写语句 MDX 数据定义语句 MDX 数据操作语句 MDX 运算符参考 --(注释) -(排除) -(负) -(减) *(叉积) *(乘) /(除) ^(幂) /*...*/(注释) //(注释) :(范围) +(加) +(正) +(字符串串联) +(联合) <(小于) <=(小于或等于) (不等于) =(等于) >(大于) >=(大于或等于) AND IS NOT OR XOR MDX 函数参考 AddCalculatedMembers Aggregate AllMembers Ancestor Ancestors Ascendants Avg Axis BottomCount BottomPercent BottomSum CalculationCurrentPass CalculationPassValue Children ClosingPeriod CoalesceEmpty Correlation Count(维度) Count(层次结构级别) Count(集) Count(元组) Cousin Covariance CovarianceN Crossjoin Current CurrentMember CurrentOrdinal CustomData DataMember DefaultMember Descendants Dimension Dimensions Distinct DistinctCount DrilldownLevel DrilldownLevelBottom DrilldownLevelTop DrilldownMember DrilldownMemberBottom DrilldownMemberTop DrillupLevel DrillupMember Error Except Exists Extract Filter FirstChild FirstSibling Generate Head Hierarchize Hierarchy IIf Intersect IsAncestor IsEmpty IsGeneration IsLeaf IsSibling Item(成员) Item(元组) KPIGoal KPIStatus KPITrend KPIWeight KPICurrentTimeMember KPIValue Lag LastChild LastPeriods LastSibling Lead Leaves Level Levels LinkMember LinRegIntercept LinRegPoint LinRegR2 LinRegSlope LinRegVariance LookupCube Max MeasureGroupMeasures Median Members(集) Members(字符串) MemberToStr MemberValue Min Mtd Name NameToSet NextMember NonEmpty NonEmptyCrossjoin OpeningPeriod Order Ordinal ParallelPeriod Parent PeriodsToDate Predict PrevMember Properties Qtd Rank RollupChildren Root SetToArray SetToStr Sib

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值