1 MDX 简介
多维表达式 (MDX) 是用于在 多维数据库(olap)中处理和检索多维数据的查询语言。MDX 利用由标识符、值、语句、函数和运算符组成的表达式,计算结果可以检索对象 (,例如集或成员) ,或者 (标量值,例如字符串或数字) 。
...
MDX 在很多方面与关系数据库常用的 SQL 语法看起来很相似。 但是,MDX 并非 SQL 语言的扩展,在许多方面都有别于 SQL。 为了创建用于设计或保护多维数据集的 MDX 表达式,或创建 MDX 查询以返回多维数据并设置其格式,您需要了解有关 MDX 和维度建模的基本概念、MDX 语法元素、MDX 运算符、MDX 语句以及 MDX 函数。
2 MDX 中的重要概念
在使用多维表达式 (MDX) 查询多维数据或创建多维数据集中的 MDX 表达式之前,有必要了解多维的概念和术语。
...
级别 存在同一维度上维表中不同列。在上图中,“发货区域”这个维度的级别有“(All)”, “发货区域”, “省份”, “发货城市”。其中“(All)”这级别为所以维度的都存在的级别,该级别存在唯一的一个“[发货区域].[(All)]”,代表发货区域所有值的集合。级别“发货区域”, “省份”, “发货城市”分别对应维表“订单表”的“发货区域”, “省份”, “发货城市”的列,级别“发货区域”下的成员“[发货区域].[(All)].[华北]”也就对应“发货区域”列的值“华北”。级别主要用于仪表盘上的下钻操作
父子成员 同一维度上不同级别成员之间的的关系。在下图中,“[发货区域].[(All)]”作为“[发货区域].[(All)].[华北]”的父成员,“[发货区域].[(All)].[华北].[吉林省]” 作为“[发货区域].[(All)].[华北]”的子成员
...
成员别名 数据模型的成员在前端展示时显示的内容,成员唯一真名虽然可以代表成员,但是其名称太多,用户不好理解,所以在前端展示时使用成员别名,成员别名可能存在同名的情况。
3 MDX 语法简介
以下语法显示了一个包括 SELECT、FROM 和 WHERE 子句的基本 SELECT 语句用法:
...
- SELECT 子句将查询列轴设置为 Measures 维度的[Measures].[销售额]成员,以及“日期” 维度的 “年份”级别的所有成员,查询行轴设置为“发货区域” 维度的 “发货区域”级别的所有成员。
- WHERE 子句将切片器轴定义为 “产品类别”维度的 [CategoryName].[(All)].[点心] 成员。
- With 部分定义了“发货区域” 维度的计算成员合计,公式为“发货区域” 维度的 “发货区域”级别的所有成员的集合结果。
4 MDX 语法元素
4.1 标识符
标识符是对象的名称。 每个对象都可以且必须具有标识符。 这些对象包括数据模型、维度、层次结构、级别、成员等等。 可以使用对象的标识符在多维表达式 (MDX) 语句中引用对象。
...
请注意,不必更改 Domestic 前面的左方括号来创建分隔标识符。 但是,必须将 Domestic 后面的右方括号替换为两个右方括号。
4.2 表达式
4.2.1 表达式
表达式是标识符、值和运算符的组合,可以计算这些标识符、值和运算符来获取结果。 访问或更改数据时,可以在多个不同位置使用数据。 例如,可以将表达式用作查询要检索的数据的一部分,或用作查找满足一组条件的数据的搜索条件。
...
WITH MEMBER [Measures].[销售额_ Special] AS [Measures].[销售额] * 1.5 SELECT [Measures].[销售额_Special] on COLUMNS, N[日期].[年份].MEMBERS ON Rows FROM [cube] |
4.2.2维度表达式
将参数传递给多维表达式 (MDX) 中的函数时,通常使用维度表达式和层次结构表达式从层次结构中返回成员、集或元组。
...
维度标识符在用于描述 MDX 语句的 BNF 表示法中显示为 Dimension_Name 。
4.2.3成员表达式
成员表达式包含成员标识符、成员函数或可转换为成员的表达式。
...
FROM [cube]
存在返回成员的许多 MDX 函数。
4.2.4元组表达式
元组由多维数据集中包含的每个维度的一个成员组成。 因此,一个元组唯一标识多维数据集内的一个单元。
...
- 如果隐式引用的维度有默认成员,则将该默认成员添加到元组中。
- 如果隐式引用的维度没有默认成员,则使用(默认维度的所有 ) 成员。
- 如果隐式引用的维度没有默认成员,则使用该维度最上层的第一个成员。
4.2.5集表达式
集由零个或多个元组的有序列表组成。 不包含任何元组的集称为“空集”。
...
由三个元组组成,每个元组包含对“产品类别”维度和 “日期” 维度上成员的两个显式引用。
4.2.6常量表达式
在多维表达式 (MDX) 中,标量表达式是 MDX 语法的一个元素;在计算时,它在计算上下文中返回单个值。
...
{MEASURES.NumericValue,MEASURES.NumericExpression,MEASURES.NumericExpressionBasedOnMeasure,MEASURES.StringValue, MEASURES.ConcatenatedString, MEASURES.StringFunction, MEASURES.TodaysDate} ON COLUMNS
FROM [cube]
4.2.7空值
空值表明特定成员、元组或单元是空的。 空单元值指明在基础事实表中找不到指定单元的数据,或者指定单元的元组代表不适用于数据模型的成员组合。
...
- 当且仅当函数中指定的元组标识的单元格为空时,IsEmpty 函数才返回 TRUE 。 否则,函数返回 FALSE。
- 当空单元值是数字运算符(+、-、*、/)中任一运算符的一个操作数时,如果另一个操作数是非空值,空单元值将被作为零处理。 如果两个操作数都为空,数字运算符将返回空单元值。
- 当空单元值是字符串串联运算符(+) 的一个操作数时,如果另一个操作数是非空值,空单元值将被作为空字符串处理。 如果两个操作数都为空,字符串串联运算符将返回空单元值。
- 当空单元格值是任意一个比较运算符的操作数时,(=。 <>、 >=、 <=、 >、 <) ,空单元格值被视为零或空字符串,具体取决于另一个操作数的数据类型是数值还是字符串。 如果两个操作数都为空,则两个操作数均作为零处理。
- 当对数字值进行排序时,空单元值排在与零相同的位置。在空单元值和零之间,空单元值排在零之前。
- 当对字符串值进行排序时,空单元值排在与空字符串相同的位置。在空单元值和空字符串之间,空单元值排在空字符串之前。
4.3运算符
4.3.1运算符
在多维表达式 (MDX) 中,可以使用运算符执行下列操作:
...
- IS
- ^
- /, *
- +, -
- <>, >=, =, <=, >, <
- NOT
- AND
- XOR
- OR
4.3.2算术运算符
可以在多维表达式 (MDX) 中使用算术运算符执行算术运算,包括加法、减法、乘法以及除法。
...
如果表达式中的所有算术运算符都具有相同的优先顺序,则执行顺序为从左到右。
括号中的表达式优先于所有其他运算。
4.3.3位运算符
逻辑运算符计算值并返回布尔值。 在多维表达式 (MDX) 中,逻辑运算符不执行按位运算。
...
OR 对数值表达式执行逻辑或运算。
XOR 对两个数值表达式执行逻辑异运算。
4.3.4比较运算符
可以对标量数据使用比较运算符。 可以在任何多维表达式 (MDX) 表达式中使用比较运算符。
...
<=(小于或等于) 对于非空的参数,如果左边的参数值小于或等于右边的参数,则返回 TRUE;否则返回 FALSE。如果其中一个参数的计算结果为空值或这两个参数的计算结果均为空值,则该运算符返回空值。
4.3.5串联运算符
串联运算符为(||)。 可以将两个或更多个字符串合并或串联成一个字符串, 还可以串联二进制字符串。
...
WITH MEMBER Measures.ProductName AS CategoryName.CurrentMember.Name || " (" || CategoryName.CurrentMember.UniqueName || ")" SELECT {Measures.ProductName} ON COLUMNS, CategoryName.CategoryName.Members ON ROWS FROM [cube] |
4.3.6集运算符
在多维表达式 (MDX) 中,集运算符对成员或集进行运算并返回一个集。 通常用集运算符替换 MDX 表达式中的多个集函数。
...
+ (Union) 返回两个集的并集,不包括重复的成员。此运算符在功能上等效于 Union (MDX) 函数。
4.3.7一元运算符
在多维表达式 (MDX) 中,一元运算符对单个操作数执行操作,如返回数值表达式的负值或正值。
...
WITH MEMBER Measures.ProductName AS -Measures._销售额_1624531356707 SELECT {Measures.ProductName} ON COLUMNS, CategoryName.CategoryName.Members ON ROWS FROM [cube] |
4.4函数
多维表达式 (MDX) 中有几类用于执行特定操作的内部函数。 下表列出了 MDX 中可用的函数类别。
...
<tuple> 元组表达式
4.5注释
注释是程序代码中不执行的文本字符串。 (注释又称为“备注”。) 可以使用注释说明代码,或者暂时禁用正在诊断的部分多维表达式 (MDX) 语句和脚本。 通过使用注释说明代码,可使程序代码在日后更易于维护。 通常使用注释记录程序名称、作者姓名和主要代码更改的日期。 也可以使用注释说明复杂的计算或解释编程方法。
...
//An example of a comment using the double-forward slash --An example of a comment using the double-hypen /*An example of a multi-line comment*/ WITH MEMBER Measures.ProductName AS -Measures._销售额_1624531356707 SELECT {Measures.ProductName} ON COLUMNS, CategoryName.CategoryName.Members ON ROWS FROM [cube] --[] |
4.5 保留字
下表包含多维表达式 (MDX) 使用的保留字。 在 MDX 中,不应在任何标识符(例如多维数据集名称或用户定义的函数名称)中使用这些保留字。
...