使用集函数
集函数从维度、层次结构、级别中检索集,或通过遍历这些对象中的成员的绝对位置和相对位置来检索集,从而以多种方法构造集。
与成员函数和元组函数一样,集函数对协商 Analysis Services 中的多维结构至关重要。 集函数对获得多维表达式 (MDX) 查询结果也很重要,因为集表达式定义了 MDX 查询的轴。
最常用的一个集函数是 Members(集)(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]
Descendants (MDX) 函数与 Children 函数类似,但其功能更强大。 它返回层次结构中一个或多个级别任何成员的后代:
SELECT
[Measures].[Internet Sales Amount]
ON Columns,
//返回一个集,该集包含 Date 维度的 Calendar 层次结构中 Calendar Year
//2004 下的所有日期
DESCENDANTS(
[Date].[Calendar].[Calendar Year].&[2004]
, [Date].[Calendar].[Date])
ON Rows
FROM [Adventure Works]
利用 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]