Главная » Microsoft SQL Server, Базы данных » Программирование запросов MDX – ЧАСТЬ 1

0

I^Jyl ногомерные выражения MDX являются в службе II ш/ II анализа аналогом того, чем в реляционных базах данных являются запросы SQL. Они реализуют как функции определения (DDL), так и функции запросов (DML), однако базируются на совершенно ином фундаменте. Как вы уже поняли, они возвращают многомерные наборы данных, а не двухмерные, однако, что более важно, запросы MDX не содержат предложений объединения JOIN, так как сам куб содержит явные связи между всеми консолидируемыми данными. Для определения структуры и содержимого результата выполняются манипуляции иерархически организованными данными измерений.

Обучение основам написания запросов MDX у студентов происходит не особенно быстро; в основном это касается тех, кто уже имел опыт работы с другими базами данных. У множества начинающих наблюдается тенденция застревать на базовом уровне запросов. Как правило, причиной этому становится непонимание всего десятка понятий и концепций. Поэтому ряд этих концепций мы выведем в самом начале главы: это кортежи (наборы взаимосвязанных величин), множества (наборы данных), части измерений и некоторые другие.

Чтобы не потерпеть поражение в атаке на MDX, рекомендуется использовать следующий стиль работы.

1.              Ознакомьтесь с разделом “Основы запросов SELECT” в начале этой главы, после чего попрактикуйтесь с предложенными примерами, пока не почувствуете себя более уверенно.

2.              Внимательно перечитайте раздел “Основы запросов SELECT”, пока основные концепции и терминология прочно не закрепятся в вашем сознании. Эти основы позволят вам сознательно знакомиться с дополнительными возможностями в разделе “Расширенные запросы SELECT” и осваивать их на практике.

3.              Читая раздел “Сценарии MDX”, начните самостоятельно определять множества и вычисления в структуре куба.

Дополнительная Об основах создания кубов, к которым выполняются запросы MDX, см. в главе 43.

информация

Несмотря на то что служба анализа входила в состав SQL Server с версии 7.0, Новинка      для веРсии 2005 этот продукт был полностью переработан. Многие основные

2005 концепции унаследованы из предыдущих версий, однако синтаксис был в зна

чительной мере расширен, а многие ограничения сняты.

Основы запросов select

Подобно SQL, инструкции SELECT в MDX являются средством извлечения данных. Базовой формой этой инструкции является следующая:

SELECT { множество1 } ON COLUMNS, { множество2 } ON ROWS FROM куб

WHERE ( множествоЗ )

Этот запрос вернет простую таблицу, в которой множество 1 и множество2 определяют заголовки столбцов и строк, куб является источником данных, а множествоЗ ограничивает фрагменты куба, которые консолидируются в таблице.

Адресация в кубе

Множество представляет собой список, состоящий из одного или нескольких кортежей. Рассмотрим пример, показанный на рис. 45.1. Он ограничен тремя иерархиями измерений (товаром, годом и мерой), что позволяет отобразить множество графически. Запрос MDX консолидирует отдельные блоки в кубе, называемые ячейками, в геометрию, определенную запросом. Отдельные ячейки куба адресуются с помощью кортежей.

Элементы кортежей каждой из иерархий формируют координаты в кубе, выбирая все ячейки на пересечении этих координат. Например, координаты (груша, 2004, количество заказов) адресуют ячейку, обозначенную на рис. 45.1 символом А. Кортежи могут также адресовать и группы ячеек, используя общий уровень измерения (All). Например, координаты (груша, все годы, количество заказов) указывают на три ячейки: ячейку, помеченную символом А, находящуюся непосредственно над ней (груша, 2003, количество заказов), а также ячейку под ней (груша, 2005, количество заказов). На самом деле, даже когда в кортеже явно не указано измерение, MDX использует член по умолчанию этого измерения (как правило, это уровень All), чтобы восполнить недостающую информацию. Таким образом, адрес (объем продаж) является эквивалентом адреса (все товары, все годы, объем продаж).

Множества создаются на основе кортежей. Таким образом, множество { (груша, 2004, количество заказов) } состоит из одной ячейки, в то время как множество { (яблоко, апельсин) } — из двенадцати, т.е. всех тех, в которых товаром не является груша. Естественно, синтаксис MDX несколько более формализован, чем в приведенном примере, а кубы на практике являются более сложными, однако концепции адресации остаются неизменными.

Структура измерения

Каждое измерение является предметной областью, которая может использоваться для организации результатов запроса MDX. В любом измерении существуют иерархии, в которые включены отдельные понятия данной предметной области. Например, измерение заказчиков может иметь иерархии по городам, странам и почтовым индексам, описывающим местонахождение клиента. Каждая из иерархий, в свою очередь, имеет один или несколько уровней, которые содержат членов или данные измерения. Члены измерения используются для построения множеств, формирующих базис запросов MDX.

Ссылки на измерения

Обращение к одному из компонентов измерения выполняется с помощью перечисления через точку его родословной. Вот несколько примеров:

[Customer] — измерение Customer [Customer].[Country] — иерархия Country [Customer].[Country].[Country] — уровень Country [Customer].[Country].[Country].&[Germany] — член Germany

Несмотря на то что технически дозволено не заключать каждый из идентификаторов в квадратные скобки, множество имен в кубах содержат пробелы и специальные символы. По этой причине имеет смысл взять за правило заключать в квадратные скобки все идентификаторы. Символ амперсанда (&) перед именем члена указывает на ссылку по ключу. На каждый член измерения можно ссылаться как по имени, так и по ключу, хотя рекомендуется все же последний вариант. В рассмотренном примере ключ и имя имели одно и то же значение. По этой причине ссылка [Customer] . [Country] . [Country] . [Germany] указывала бы на тот же член измерения. В то же время другие иерархии могут иметь более запутанные ключи. Например, ссылка [Customer] . [Customer] . [Customer] . & [20755] вполне может быть эквивалентом [Customer] . [Customer] . [Customer] . [Mike White].

В дополнение к ссылкам на отдельные члены измерения большинство измерений имеют общий уровень, который ссылается на всех членов измерения. По умолчанию именем этого уровня является [All], однако создатель куба мог назначить ему и другое имя. Например, общий уровень в измерении Customer базы AdventureWorks имеет имя [All Customers]. На общий уровень можно создать ссылку как из измерения, так и из иерархии:

[Customer] . [All Customers] – Ссылка на общий уровень из измерения [Customer] . [Country] . [All Customers] – Ссылка на общий уровень из иерархии

Кортежи и простые множества

Как уже говорилось в разделе “Адресация в кубе”, кортежи создаются путем перечисления одного члена из каждой иерархии; также для некоторых иерархий члены можно явно не задавать — в этом случае в кортеж будет неявно включен общий уровень этой иерархии. Скобки используются для группировки списка членов кортежа. Например, следующий кортеж ссылается на все ячейки, содержащие объемы Интернет-продаж для заказчиков из Германии в разрезе всех времен, всех территорий и т.д.:

([Customer].[Country].[Country].&[Germany],

[Measures].[Internet Sales Amount])

Если некоторый простой кортеж определен только с одним членом иерархии, то скобки можно опустить, поэтому всех заказчиков из Германии можно определить просто как [Customer].[Country].[Country]. &[Germany]

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

{[Customer].[Country].[Country]. &[France],

[Customer].[Country].[Country].&[Germany]}

Базовая инструкция select

Простые множества позволяют создать инструкцию SELECT базового вида. Запрос из следующего примера возвращает объемы Интернет-продаж клиентам из Г ермании и Франции за 2003 и 2004 календарные годы:

SELECT

{[Customer].[Country].[Country].&[France],

[Customer].[Country].[Country]. &[Germany]} ON COLUMNS,

{[Date] . [Calendar Year] . [Calendar Year] .&[2003] ,

[Date].[Calendar Year].[Calendar Year]. &[2004]} ON ROWS FROM [Adventure Works]

WHERE ([Measures].[Internet Sales Amount])

Будет получен следующий результат:

France

Germany

CY 2003

$1026324,97

$1058405,73

CY 2004

$922179,04

$1076890,77

В этом примере множества размещены вдоль двух осей, значения которых становятся заголовками строк и столбцов. Предложение WHERE ограничивает результаты запроса только теми ячейками, в которых содержатся объемы Интернет-продаж. Такой частный случай обычно называют срезом, так как он ограничивает область определения запроса всего одним сечением куба. Срез можно представить себе как определение вклада в запрос некоторой иерархии, которая не является частью определения какой-либо оси.

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

SELECT

{ [Customer] . [Country] . [Country] . &[France],

[Customer] . [Country] . [Country] . &[Germany]} ON COLUMNS,

{( [Product] . [Product Line] . [Product Line] . &[S],

[Sales Reason].[Sales Reason Type].[Sales Reason Type]. &[Marketing]), ( [Product] . [Product Line] . [Product Line] . &[S],

[Sales Reason].[Sales Reason Type].[Sales Reason Type]. &[Promotion]),

( [Product] . [Product Line] . [Product Line] . &[M],

[Sales Reason] . [Sales Reason Type] . [Sales Reason Type] . &[Marketing]),

([Product] . [Product Line] . [Product Line] . &[M],

[Sales Reason].[Sales Reason Type].[Sales Reason Type]. &[Promotion])

} ON ROWS FROM [Adventure Works]

WHERE ([Measures].[Internet Sales Amount],

[Date].[Calendar Year].[Calendar Year].?[2004])

Будет получен следующий результат:

France

Germany

Accessory

Marketing

$962,79

$349,90

Accessory

Promotion

$2241,84

$2959,86

Mountain

Marketing

$189,96

$194,97

Mountain

Promotion

$100209,88

$126368,03

Такое отображение иерархий на заголовки обеспечивает управление геометрией результирующего набора данных, однако порождает ограничение на создание множеств вдоль осей — иерархии, определенные для кортежей в множестве, должны быть единообразными во всех элементах множества. В приведенном выше примере не допускается, чтобы некоторые кортежи использовали иерархию Product Category вместо Product Line. Несоответствия между кортежами обычно вызывают появление пустых заголовков ячеек, которые MDX не знает, как обрабатывать.

Источник: Нильсен, Пол. Microsoft SQL Server 2005. Библия пользователя. : Пер. с англ. — М. : ООО “И.Д. Вильямс”, 2008. — 1232 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии