|
Назначение языка MDX (Multidimensional Expressions) — предоставить в распоряжение разработчиков средство для более простого и эффективного доступа к многомерным структурам данных. В Microsoft SQL Server 2000 Analysis Services язык MDX используется для формирования запросов и описания алгоритмов получения вычисляемых значений. Следует сказать, что язык MDX никак не связан с Microsoft SQL Server 2000 Analysis Services, а является частью спецификации OLE DB for OLAP и, таким образом, поддерживается на уровне провайдера доступа к данным (OLE DB-провайдера), а не самого OLAP-хранилища. Этот язык можно сравнить с языком SQL. Но если SQL используется для извлечения реляционных данных, то MDX служит для извлечения многомерных данных. Естественно, что, как и в случае с языком SQL, возможны некоторые отклонения от стандарта. В этой статье мы рассмотрим язык MDX применительно к Microsoft SQL Server 2000 Analysis Services.
Использование языка MDX MDX Sample Application Для выполнения запросов на языке MDX мы будем использовать утилиту MDX Sample Application, входящую в состав Microsoft SQL Server 2000 Analysis Services. При запуске этой утилиты появляется диалоговая панель Connect, в которой следует указать имя сервера (имя компьютера, на котором установлен Microsoft SQL Server 2000 Analysis Services) и тип провайдера для связи с этим сервером — в нашем примере это будет MSOLAP.
После этого можно нажать кнопку OК. Нажатие кнопки Cancel отменяет данную диалоговую панель — в этом случае для связи с сервером следует воспользоваться командой Connect из меню File. После соединения с сервером можно начинать создание MDX-запросов к многомерной базе данных и их выполнение. Часто бывает полезно знать структуру куба, к которому вы собираетесь обратиться. Утилита MDX Sample Application позволяет просматривать метаданные куба. Для этого необходимо выбрать интересующий вас куб в списке Cube и изучить его размерности и меры в древовидном представлении содержимого куба. Верхняя панель утилиты MDX Sample Application предназначена для задания MDX-запросов. Мы можем либо выбрать один из предопределенных запросов (список Query), либо создать собственный. По умолчанию утилита использует запросы, находящиеся в файле MDXQuery.mdx, расположенном в папке MDXSample. Для загрузки другого файла или сохранения текущего используются команды меню File. Можно вводить MDX-команды непосредственно в панели запросов или конструировать запрос, перетаскивая измерения и меры куба в панель запросов. Помимо этого можно использовать примеры функций из панели Syntax Examples. В этом случае в панель переносится копия примера, в котором следует изменить аргументы функций и разделители на нужные значения.
Выполнить запрос можно одним из трех способов: Результат выполнения запроса отображается в нижней части экрана или, если выбрана опция View | Results, во весь экран. Отметим, что MDX Sample Application не выполняет проверку корректности введенного MDX-запроса перед отсылкой его серверу на обработку.
Теперь вы готовы приступить к изучению языка MDX. Этой теме будет посвящена следующая часть данной статьи. В качестве исходных данных для выполнения примеров мы воспользуемся многомерной базой данных FoodMart, входящей в комплект поставки Microsoft SQL Server Analysis Services. Синтаксис языка MDX Запрос на языке MDX представляет собой набор команд, который выглядит следующим образом: SELECT [<axis_specification> [, <axis_specification>...]] FROM [<cube_specification>] [WHERE [<slicer_specification>]] где: axis_specification — содержит описание осей куба; cube_specification — содержит название куба; slicer_specification — содержит описание срезов куба. В языке MDX выражение SELECT используется для задания набора данных, содержащего подмножество многомерных данных. Простейший SELECT-запрос может выглядеть так: В этом примере мы получили общее число продаж (Unit Sales) для всего куба. Поскольку в запросе мы не указали имена членов измерений, были выбраны члены по умолчанию из каждого измерения. Наш запрос эквивалентен следующему: SELECT {([Measures].[Unit Sales])} ON COLUMNS FROM SALES Более полный SELECT-запрос должен содержать следующую информацию: число осей (в одном запросе можно указать до 128 осей); список членов измерения, которые должны быть включены для каждой оси; имя куба, к которому производится запрос; список членов среза. Рассмотрим более сложный пример, который позволит нам разобраться с различными элементами MDX-запроса: SELECT { [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS, { [Time].[1997], [Time].[1998] } ON ROWS FROM Sales WHERE ( [Store].[USA].[CA] ) SELECT определяет используемые оси. В нашем примере их две: одна — задает значения для колонок, другая — для рядов: { [Measures].[Unit Sales], [Measures].[Store Sales] } ON COLUMNS, { [Time].[1997], [Time].[1998] } ON ROWS Выражение FROM определяет источник многомерных данных, к которому обращен наш запрос. В данном примере — это куб Sales. Выражение WHERE задает размерности или члены, используемые в качестве среза. В нашем примере мы ограничили данные размерностью Store. Рассмотрим еще несколько запросов. В первом запросе мы получаем данные по продажам всех товаров для всех лет: SELECT[Product].[Product Category].Members ON COLUMNS FROM Sales Данные для целого года (1997): SELECT[Product].[Product Category].Members ON COLUMNS, {[Time].[1997]} ON ROWS FROM Sales Данные по кварталам: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Time].[Quarter].Members} ON ROWS FROM Sales Данные для первого квартала: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Time].[1997].[Q1]} ON ROWS FROM Sales Данные для первого месяца первого квартала: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Time].[1997].[Q1].[1]} ON ROWS FROM Sales Продажи для всех клиентов в США: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Customers].[All Customers].[USA]} ON ROWS FROM Sales Продажи для всех клиентов в штате Калифорния: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Customers].[All Customers].[USA].[CA]} ON ROWS FROM Sales Продажи товаров по категориям для всех клиентов в штате Калифорния: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Product].[Product Family].Members} ON ROWS FROM Sales WHERE [Customers].[All Customers].[USA].[CA] Продажи товаров по категориям для всех клиентов в штате Калифорния в первом квартале 1997 года: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Product].[Product Family].Members} ON ROWS FROM Sales WHERE ([Customers].[All Customers].[USA].[CA], [Time].[1997].[Q1]) Продажи морепродуктов для всех клиентов в штате Калифорния в первом квартале 1997 года: SELECT {([Measures].[Unit Sales])} ON COLUMNS, {[Product].[Product Department].[Seafood]} ON ROWS FROM Sales WHERE ([Customers].[All Customers].[USA].[CA], [Time].[1997].[Q1]) Функции языка MDX Функции, реализованные в языке MDX, разделяются на несколько групп, как показано в таблице. Группы функций и входящие в них функции | Array Functions | SetToArray | | | | | Dimension, Hierarchy and Level Functions | | | | | Dimension | Dimensions | Hierarchy | Level | Levels | Logical Functions | | | | | Is | IsAncestor | IsEmpty | IsGeneration | IsLeaf | IsSibling | | | | | Member Functions | | | | | Ancestor | ClosingPeriod | Cousin | CurrentMember | DataMember | DefaultMember | FirstChild | FirstSibling | Ignore | Item | Lag | LastChild | LastSibling | Lead | LinkMember | Members | NextMember | OpeningPeriod | ParallelPeriod | Parent | PrevMember | StrToMember | ValidMeasure | | | Numeric Functions | | | | | Aggregate | Avg | CalculationCurrentPass | CalculationPassValue | CoalesceEmpty | Correlation | Count | Covariance | CovarianceN | DistinctCount | IIf | LinRegIntercept | LinRegPoint | LinRegR2 | LinRegSlope | LinRegVariance | LookupCube | Max | Median | Min | Ordinal | Predict | Rank | RollupChildren | Stddev | StddevP | Stdev | StdevP | StrToValue | Sum | Value | Var | Variance | VarianceP | VarP | Set Functions | | | | | AddCalculatedMembers | AllMembers | Ancestors | Ascendants | Axis | BottomCount | BottomPercent | BottomSum | Children | Crossjoin | Descendants | Distinct | DrilldownLevel | DrilldownLevelBottom | DrillDownLevelTop | DrilldownMember | DrilldownMemberBottom | DrilldownMemberTop | DrillupLevel | DrillupMember | Except | Extract | Filter | Generate | Head | Hierarchize | Intersect | LastPeriods | Members | Mtd | NameToSet | NonEmptyCrossjoin | Order | PeriodToDate | Qtd | Siblings | StripCalculatedMembers | StrToSet | Subset | Tail | ToggleDrillState | TopCount | TopPercent | TopSum | Union | VisualTotals | Wtd | Ytd | | | String Functions | | | | | CalculationPassValue | CoalesceEmpty | Generate | IIf | LookupCube | MemberToStr | Name | Properties | SetToStr | TupleToStr | UniqueName | UserName | | | | Tuple Functions | | | | | Current | Item | StrToTuple | | | Other Functions | | | | | Call | | | | | Кроме того, перечисленные функции языка MDX могут использоваться при вычислении различных выражений, в том числе при создании вычисляемых измерений. Кроме того, при необходимости для применения в MDX можно создавать функции, определенные пользователем (User Defined Functions, UDF), с помощью средств разработки, поддерживающих создание COM DLL.
Более подробные сведения о синтаксисе этого языка вы можете найти в Microsoft SQL Server Books Online, а примеры его практического применения — в статье «Введение в MDX», опубликованной в этом номере журнала. В следующей части статьи мы рассмотрим создание OLAP-клиентов, использующих для доступа к многомерным данным механизмы ADO и ADOMD. |