指定查询轴的内容 (MDX)

查询轴用于指定由多维表达式 (MDX) SELECT 语句所返回的单元集的范围。通过指定单元集的范围可以限定客户端可以看到的返回数据。

若要指定查询轴,请使用 <SELECT query axis clause> 将某个集分配给特定的查询轴。每个 <SELECT query axis clause> 值均定义一个查询轴。数据集中的轴数等于 SELECT 语句中 <SELECT query axis clause> 值的数目。

查询轴的语法

以下语法显示了 <SELECT query axis clause> 的语法:

<SELECT query axis clause> ::=
   [ NON EMPTY ] Set_Expression [ <SELECT dimension property list clause> ] [<HAVING clause>]
   ON {
      Integer_Expression | 
      AXIS( Integer_Expression ) | 
      {COLUMNS | ROWS | PAGES | SECTIONS | CHAPTERS}   
      }
      

每个查询轴具有一个编号:零 (0) 表示 x 轴,1 表示 y 轴,2 表示 z 轴,依此类推。在 <SELECT query axis clause> 的语法中,Integer_Expression 值指定了轴编号。MDX 查询最多可以指定 128 个轴,但几乎没有 MDX 查询会用到 5 个以上的轴。对于前 5 个轴,也可以改为使用 COLUMNS、ROWS、PAGES、SECTIONS 和 CHAPTERS 别名。

MDX 查询无法跳过查询轴。也就是说,包括一个或多个查询轴的查询不能排除编号较低的轴或中间轴。例如,查询不能有 ROWS 轴而无 COLUMNS 轴,或有 COLUMNS 和 PAGES 轴而无 ROWS 轴。

但是,可以指定不带任何轴的 SELECT 子句,即,空的 SELECT 子句。在这种情况下,所有维度均为切片器维度,并且 MDX 查询选择一个单元。

在前面所示的查询轴语法中,每个 Set_Expression 值均指定了用于定义查询轴的内容的集。有关这些集的详细信息,请参阅使用成员、元组和集 (MDX)

示例

下面这个简单的 SELECT 语句返回列轴上的 Internet Sales Amount 度量值,并且使用 MDX MEMBERS 函数返回来自行轴上日期维度的日历层次结构的所有成员:

SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,
{[Date].[Calendar].MEMBERS} ON ROWS
FROM [Adventure Works]

下面这两个查询返回完全相同的结果,但演示的是轴编号而非别名的用法:

SELECT {[Measures].[Internet Sales Amount]} ON 0,
{[Date].[Calendar].MEMBERS} ON 1
FROM [Adventure Works]

SELECT {[Measures].[Internet Sales Amount]} ON AXIS(0),
{[Date].[Calendar].MEMBERS} ON AXIS(1)
FROM [Adventure Works]

在集定义之前使用的 NON EMPTY 关键字是从轴中删除所有空元组的简便方法。例如,在这些示例中,我们看到在多维数据集中没有来自 2004 年 8 月之前的数据。为了从单元集中删除在任何列中都没有数据的所有行,只需按如下所示在行轴定义上的集之前添加 NON EMPTY 即可:

SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS,
NON EMPTY
{[Date].[Calendar].MEMBERS} ON ROWS
FROM [Adventure Works]

NON EMPTY 可用于查询中的所有轴。比较以下两个查询的结果,第一个查询未使用 NON EMPTY,而第二个查询对两个轴都使用了 NON EMPTY:

SELECT {[Measures].[Internet Sales Amount]} 
* [Promotion].[Promotion].[Promotion].MEMBERS
ON COLUMNS,
{[Date].[Calendar].[Calendar Year].MEMBERS} ON ROWS
FROM [Adventure Works]
WHERE([Product].[Subcategory].&[19])

SELECT NON EMPTY {[Measures].[Internet Sales Amount]} 
* [Promotion].[Promotion].[Promotion].MEMBERS
ON COLUMNS,
NON EMPTY
{[Date].[Calendar].[Calendar Year].MEMBERS} ON ROWS
FROM [Adventure Works]
WHERE([Product].[Subcategory].&[19])

HAVING 子句可用于基于特定条件对轴的内容进行筛选;它在灵活性方面低于可实现相同结果的其他方法,例如 FILTER 函数,但在使用上更为简单。下面是一个例子,它只返回 Internet Sales Amount 大于 $15,000 的那些日期:

SELECT {[Measures].[Internet Sales Amount]} 
ON COLUMNS,
NON EMPTY
{[Date].[Calendar].[Date].MEMBERS} 
HAVING [Measures].[Internet Sales Amount]>15000
ON ROWS
FROM [Adventure Works]