Использование наборов функций

Функция множества извлекает множество из измерения, иерархии, уровня или, проходя по абсолютному и относительному положениям элементов внутри этих объектов, строя множество различными способами.

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

Одной из самых распространённых функций множества является функция Members (Set) (MDX ), которая извлекает множество всех членов из измерения, иерархии или уровня. Ниже приведён пример его использования в запросе:

SELECT  
//Returns all of the members on the Measures dimension  
[Measures].MEMBERS  
ON Columns,  
//Returns all of the members on the Calendar Year level of the Calendar Year Hierarchy  
//on the Date dimension  
[Date].[Calendar Year].[Calendar Year].MEMBERS  
ON Rows  
FROM [Adventure Works]  

Ещё одной часто используемой функцией является функция Crossjoin (MDX ). Он возвращает набор кортежей, представляющих декартовое произведение множеств, переданных в него как параметры. На практике эта функция позволяет создавать «вложенные» или «перекрёстные» оси в запросах:

SELECT  
//Returns all of the members on the Measures dimension  
[Measures].MEMBERS  
ON Columns,  
//Returns a set containing every combination of all of the members  
//on the Calendar Year level of the Calendar Year Hierarchy  
//on the Date dimension and all of the members on the Category level  
//of the Category hierarchy on the Product dimension  
Crossjoin(  
[Date].[Calendar Year].[Calendar Year].MEMBERS,  
[Product].[Category].[Category].MEMBERS)  
ON Rows  
FROM [Adventure Works]  

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

SELECT

[Меры]. [Объем продаж через Интернет]

ON Columns,

Возвращает набор, содержащий все даты ниже календарного года

2004 год в календарной иерархии измерения Дата

ПОТОМКИ (

[Дата]. [Календарь]. [Календарный год].&[2004]

, [Дата]. [Календарь]. [Дата])

ON Rows

ИЗ [Приключенческие работы]

Функция Order (MDX) позволяет упорядочить содержимое множества в восходящем или убывающем порядке согласно определённому числовому выражению. Следующий запрос возвращает те же участники в строках, что и предыдущий запрос, но теперь упорядочен по мере Internet Sales Amount:

SELECT  
[Measures].[Internet Sales Amount]  
ON Columns,  
//Returns a set containing all of the Dates beneath Calendar Year  
//2004 in the Calendar hierarchy of the Date dimension  
//ordered by Internet Sales Amount  
ORDER(  
DESCENDANTS(  
[Date].[Calendar].[Calendar Year].&[2004]  
, [Date].[Calendar].[Date])  
, [Measures].[Internet Sales Amount], BDESC)  
ON Rows  
FROM [Adventure Works]  

Этот запрос также иллюстрирует, как множество, возвращаемое из одной функции множества, Descendants, может быть передано в качестве параметра в другую функцию множества — Order.

Фильтрация множества по определённым критериям очень полезна при написании запросов, и для этого можно использовать функцию Filter (MDX ), как показано в следующем примере:

SELECT  
[Measures].[Internet Sales Amount]  
ON Columns,  
//Returns a set containing all of the Dates beneath Calendar Year  
//2004 in the Calendar hierarchy of the Date dimension  
//where Internet Sales Amount is greater than $70000  
FILTER(  
DESCENDANTS(  
[Date].[Calendar].[Calendar Year].&[2004]  
, [Date].[Calendar].[Date])  
, [Measures].[Internet Sales Amount]>70000)  
ON Rows  
FROM [Adventure Works]  

Существуют другие, более сложные функции, которые позволяют фильтровать множество другими способами. Например, следующий запрос показывает, что функция TopCount (MDX ) возвращает верхние n элементов в множестве:

SELECT  
[Measures].[Internet Sales Amount]  
ON Columns,  
//Returns a set containing the top 10 Dates beneath Calendar Year  
//2004 in the Calendar hierarchy of the Date dimension by Internet Sales Amount  
TOPCOUNT(  
DESCENDANTS(  
[Date].[Calendar].[Calendar Year].&[2004]  
, [Date].[Calendar].[Date])  
,10, [Measures].[Internet Sales Amount])  
ON Rows  
FROM [Adventure Works]  

Наконец, возможно выполнять ряд логических операций с множеством с помощью функций, таких как Intersect (MDX), Union (MDX) и функции Except (MDX ). Следующий запрос показывает примеры последних двух функций:

SELECT  
//Returns a set containing the Measures Internet Sales Amount, Internet Tax Amount and  
//Internet Total Product Cost  
UNION(  
{[Measures].[Internet Sales Amount], [Measures].[Internet Tax Amount]}  
, {[Measures].[Internet Total Product Cost]}  
)  
ON Columns,  
//Returns a set containing all of the Dates beneath Calendar Year  
//2004 in the Calendar hierarchy of the Date dimension  
//except the January 1st 2004  
EXCEPT(  
DESCENDANTS(  
[Date].[Calendar].[Calendar Year].&[2004]  
, [Date].[Calendar].[Date])  
,{[Date].[Calendar].[Date].&[915]})  
ON Rows  
FROM [Adventure Works]