select Measures [Сумма продаж] on Columns, Товар.members on Rows from MyCube where Время.[2014] Контекст выполнения запросов Когда сервер получает запрос, он в первую очередь проходит по элементам множества, спроецированным на оси. Эти элементы будут возвращены клиентскомму приложению и, как правило, используются для заголовков таблицы или меток на осях диаграммы. Затем сервер вычисляет значения ячеек на пересечении каждой оси. Координаты, в контексте которых вычисляет значение, называются текущими координатами. Для измерений и мер, на которые нет ссылок по осям и которые не использованы в where, сервер использует члены по умолчанию. select {Клиент.Страна.Укр.} on 0, {(Товар.Категория.Напитки, Время.Год.[2014])} on 1 from MyCube where Measures.[ПродКолич] 1) Текущая координата заполняется элементами по умолчанию всех иерархий измерений. Measures.DefaultMember, Клиент.All, Клиент.Город.All, Клиент.Страна.All, ... Товар.All, Товар.Производитель.All, Товар.Категория.All, Время.All, Время.Дата.All, Магазин.All, Магазин.Город.All, ... 2) Текущая координата перезаписывается элементами, использоваными в where Measures.[ПродКолич], --//-- 3) Текущая координата перезаписывается элементами, записанными на осях куба Клиент.Страна.Укр Время.Год.2014 4) Вычисляется значение ячейки Построение именованных множеств в многомерных выражениях Именованное множество используется, чтобы облегчить работу с длинными, сложными или часто используемыми множествами. По сути, это выражение, которому присвоен псевдоним. В именованное множество могут входить все те же функции и операции, которые могут быть использованы для обычных множеств. Именованное множество может создаваться в двух контекстах: 1) контекст запроса (создаётся вместе с запросом и может быть использовано только в этом запросе); 2) контекст сеанса (может использоваться во всех запросах сеанса). with (set Псевдоним as Выражений) [, (set Псевдоним as ("Выр") ... ] select Опис Осей from Куб [where ... ] Пример: пусть нужно извлечь сведения о продаж вин Шардоне и Каберне select {Товар.[Все тов].Напитки.Алкоголь.[Пиво и вина].[Шабо].[Шабо Шердоне], Товар.--//-- ... .[ФБ].[ФБ Шердоне], ... Товар.--//--.[Шабо].[Шабо Каберне], --//--.[ФБ].[ФБ Каберне], with(set [ШК] on 1 {select {Товар.[Все тов].Напитки.Алкоголь.[Пиво и вина].[Шабо].[Шабо Шердоне], Товар.--//-- ... .[ФБ].[ФБ Шердоне], ... Товар.--//--.[Шабо].[Шабо Каберне], --//--.[ФБ].[ФБ Каберне], select [ШК] on 0, Measures.[ОбъёмПрод] on 1 from MyCube create [session][hidden] set currentcube/ИмяКуба.Псевдоним as 'Выр' create set [MyCube.[МойТовар] as {Товар.Категория.Напитки} select [МойТовар] on 0 from MyCube Контекст запроса имеет приоритет перед контекстом сеанса. Вычисляемый член можно создавать в любом месте иерархии. Вычисляемые члены могут зависеть и от значений измерений, и от других вычисляемых членов, определённых в том же многомерном выражении. Также возможны контекст запроса и контекст сеанса. with [calculated]member Псевдоним as Выр [Свойство=Значение[, ...]] select ... Псевдоним --- это полное имя вызываемого члена, которое включает в себя измерение и уровень, с которым связан вычисляемый член. with member [measures].[СпецСк] as [measures].[Скидка]*1.5 select [measures].[СпецСк] on 0, Товар.members on 1 from MyCube where Товар.Категория.Напитки with member Товар.[Пиво и вина].[Хороший продавец] as iif(Товар.[Пиво и вино]>100,"Да","Нет") select Товар.[Хороший продавец] on 0, Магазин.Назв.Members on 1 from MyCube with member [Measures].[СпецСк] as [measures].[Скидка]*1.5, member [measures].[Сумма спец ск] as [measures].[СпецСк]*[measures].[Цена ед] select {measures.[СпецСк], measures.[Сумма спец ск] on 0, Товар.members on 1 from MyCube where Товар.Категория.Напитки С помощью свойства SOLVE_ORDER задаётся порядок вычисления членов Написать запрос для сравнения качества работы компания в 2013 и 2014 году with member Время.[14 к 13] as Время.[2014]-Время.[2013], member Measures.Прибыль as 'Measures.Продажа-Measures.Себестоимость' select {measures.Продажа, measures.Стоимость, measures.Прибыль} on 0, {Время.[2013], Время.[2014], Время.[14 к 13]} on 1 from MyCube |Продажа|Себест|Приб| -----------+-------+------+----+ 2013 |300 |220 |80 | -----------+-------+------+----+ 2014 |350 |210 |140 | -----------+-------+------+----+ 14 к 13 |50 |-10 |60 | -----------+-------+------+----+ create [session][hidden] [calculated] member currencube/ИмяКуба.Псевдоним as Выр [,Свойство=знач[,...]] Свойства SOLVE_ORDER FORMAT_STRING -- задаёт формат отображения ячеек полож; отриц; нули; пустые '#,#;(#,#);' (1,234.5) '#,#.###;' 1123,467=>1,123.467 Запятая указывает, что надо отображать числа с разделителем тысяч, точка указывает, сколько знаков после запятой отображать. '#%;' 6=>600% VISIBLE NON_EMPTY_BEHAVIOR -- указывает меру или набор, используемые для определения поведения вычисляемых элементов при разрешении пустых ячеек Функции MDX Функции MDX делятся на методы и свойства Методы имеют вид: ИмяФунц([Пар1],[Пар2],...]] crossjoin({[2013],[2014]}, {Укр,РФ,Молдова}) Свойства имеют вид: Объект.ИмяСв[(Пар...)] Время.members Обе эти функции могут возвращать значение одного из следующих типов: измерение, иерархия, уровень, член, кортеж, множество, скалярное значение. Функции для навигации в иерархиях Функция members применяется к иерархиям или к уровням. При применении к иерархии функция возвращает множество всех членов иерархии независимо от уровня. При применении к уровню иерархии возвращает члены только этого уровня. Функция allmembers, в отличие от members, возвращает также вычисляемые члены. Для перемещения в пределах одного уровня можно использовать функции PrevMember и NextMember Дата.[2014].[Март].NextMember -- апрель 2014 Дата.[2014].[Март].prevmember.prevmember -- янв 2014 \------lag(2)-------/ lag(n) lead(n) Children Parent select Укр.Children on 0 from MyCube +--------+ +--------+ +-------+ |Киев | |Од | |Херс | +--------+ +--------+ +-------+ |Мера по | |умолчани| |ю | +--------+ +--------+ +-------+ Descendants -- возвращает множество членов, которые являются потомками заданного члена на заданном уровне иерархии. select Descendants (Укр,[Город маг]) on 0 from MyCube firstChild lastChild Filter(множество, выражение -- критерий отбора): boolean select filter (магазин.member, (КоличПрод,[2014])<КоличПрод,[2013])) on 0, {[2013],[2014]} on 1 from MyCube where [КоличПрод] select filter (Клиент.Страна.members, measures.КоличПрод.Value>1000) on 0 from myCube where Время.Год.[2014]