MDX 查询和切片器轴 - 指定查询轴的内容

适用于: SQL Server Analysis Services Azure Analysis Services Fabric/Power BI Premium

查询轴用于指定多维表达式 (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 语句针对 Columns 轴返回度量值 Internet Sales Amount,并使用 MDX MEMBERS 函数返回 Rows 轴的 Date 维度上的 Calendar 层次结构中的所有成员。

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 月开始的数据。 要从单元集中删除列中没有数据的所有行,只需在 Rows 轴定义中的集前面添加 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]  
  

另请参阅

指定切片器轴的内容 (MDX)