Поделиться через


Определение содержимого оси запроса (многомерные выражения)

Оси запроса указывают границы набора ячеек, возвращаемого инструкцией многомерных выражений SELECT. Определение границ набора ячеек позволяет ограничить возвращаемые данные, видимые клиенту.

Для определения осей запроса используется инструкция <SELECT query axis clause>, связывающая набор с определенной осью запроса. Каждое значение в инструкции <SELECT query axis clause> определяет одну ось запроса. Число осей в наборе данных равно числу значений <SELECT query axis clause> в инструкции SELECT.

Синтаксис определения оси запроса

Для определения оси запроса в инструкции <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) для оси Х, 1 для оси Y, 2 для оси Z и т. д. В приведенном синтаксисе инструкции <SELECT query axis clause> значение Integer_Expression задает номер оси. В запросе многомерных выражений поддерживается до 128 осей, но очень редко в многомерных запросах встречается больше 5 осей. Для первых 5 осей можно использовать псевдонимы COLUMNS, ROWS, PAGES, SECTIONS и CHAPTERS.

В запросе многомерных выражений оси запроса не могут пропускаться. Это означает, что запрос, содержащий одну или несколько осей, не может не включать в себя промежуточные оси или оси с предыдущими номерами. Например, не может быть запроса с осью ROWS, но без оси COLUMNS, или с осями COLUMNS и PAGES без оси ROWS.

Можно, однако, указать предложение SELECT совсем без осей (то есть пустое предложение SELECT). В этом случае все измерения будут измерениями среза, а запрос многомерных выражений выберет только одну ячейку.

В приведенном выше синтаксисе оси запроса каждое значение Set_Expression указывает набор, определяющий содержимое оси запроса. Дополнительные сведения о наборах см. в разделе Работа с элементами, кортежами и наборами (многомерные выражения).

Примеры

Следующая простая инструкция SELECT возвращает меру объема продаж в Интернете (Internet Sales Amount) по оси столбцов (Columns) и использует функцию многомерного выражения MEMBERS для возврата всех элементов из иерархии Calendar по измерению Date в оси строк (Rows):

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 года. Чтобы удалить из набора ячеек все строки, в которых данные отсутствуют во всех столбцах, просто добавьте выражение NON EMPTY перед набором в определении оси строк (Rows), как показано далее:

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

Предложение 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]