1.Order(Set_Expression,Numberic_Expression[,{ASC|DESC|BASC|BDESC}])
Order函数既可以考虑层次结构(通过使用ASC或DESC标志来指定),也可以不考虑层次结构(通过使用BASC或BDESC标志来指定,其中B表示"打乱层次结构").如果指定了ASC或DESC,则Order函数先根据成员在层次结构中的位置进行排序,然后对每一级别进行排序.如果指定了BASC或BDESC,则Order函数排列集中的所有成员时不考虑层次结构.如果未指定任何标志,则默认为"ASC"
如果Order函数用于其两个或多个层次结构执行叉积的集合,并且使用DESC标志,则只对该集合中最后一个层次结构的成员进行排序.这与Analysis service 2000不同,厚泽对集合中的所有层次结构进行排序.
示例:
SELECT{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Order(
{[Product].[Subcategory].children},
([Measures].[Reseller Sales Amount]),DESC)
ON ROWS
from[BF_MDX]
效果如下:
2. 结合vba函数
SELECT{([Measures].[Reseller Sales Amount]),([Measures].[Internet Sales Amount])}
ON COLUMNS,Order({[Product].[Product].[Product].Members},
VBAMDX!ABS(([Measures].[Reseller Sales Amount]) -([Measures].[Internet Sales Amount])),DESC)
ON ROWS
from[BF_MDX]
效果如下,结果就是经销商减去网络销售,差距最大的往上排序:
3. 注意参数的区别
SELECT{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Order({[Product].[Category].[Category].Members} *
{[Product].[Subcategory].[Subcategory].Members},
([Measures].[Reseller Sales Amount]),desc --BDESC
)
ON ROWS
FROM[BF_MDX]
效果如下,每个大类下的小类排序 ,如果是BDESC的话就是全局排序,不分大小类:
2.层次结构排序
Hierarchize(Set_Expression [ , POST ] )
Hierarchize函数按层次结构的顺序组织指定集中的成员。 此函数始终保留重复项。
如果未指定 POST ,则此函数按自然顺序对一定级别的成员进行排序。 如果未指定其他排序条件,则成员的自然顺序就是它们在层次结构中的默认排序顺序。 子成员会紧跟在它们的父成员之后。
如果指定了 POST ,则 Hierarchize
函数按非自然顺序对一定级别的成员进行排序。 也就是说,子成员优先于他们的父级。
示例:
SELECT{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Hierarchize({([Product].[Product Categories].[Subcategory].[Road Bikes]),
([Product].[Product Categories].[All Products]),
([Product].[Product Categories].[Subcategory].[Mountain Bikes]),
([Product].[Product Categories].[Category].[Bikes]),
([Product].[Product Categories].[Subcategory].[Touring Bikes])})
ON ROWS
from [BF_MDX]
效果如下;
3. 范围选取函数topcount和bottomcount, head和tail
}
TopCount(<
table expression
>, <
rank expression
>, <
count
>)
}
按指定数量返回最前面的行,并以表达式指定的降序排列。
}
BottomCount(<
table expression
>, <
rank expression
>, <
count
>)
}
按指定数量返回最底部的行,以表达式指定的升序排列。
}
Head(
Set_Expression
[ ,
Count
] )
}
Head
函数从指定集的开始处返回指定的元组数目。并保留元素的顺序。
Count
的默认值为
1
。如果指定的元组数目小于
1
,则
Head
函数返回空集。如果指定的元组数目超过了集中的元组数目,则此函数返回原始集。
}
Tail(
Set_Expression
[ ,
Count
] )
}
Tail
函数从指定集的结尾处返回指定的元组数目。 会保留元素的顺序。
Count
的默认值为
1
。如果指定的元组数目小于
1
,则该函数返回空集。 如果指定的元组数目超过了集中的元组数目,则此函数返回原始集。
示例:
SELECT{([Measures].[Reseller Sales Amount])} ON COLUMNS,
TopCount({[Product].[Subcategory].[Subcategory].Members},5,
([Measures].[Reseller Sales Amount])
) ON ROWS
from [BF_MDX]
效果:
示例2.
SELECT{([Measures].[Reseller Sales Amount])} ON COLUMNS,
TopCount({[Product].[Subcategory].[Subcategory].Members},5,
SELECT {([Measures].[Reseller Sales Amount])} ON COLUMNS,
head(
order(
{[Product].[Subcategory].[Subcategory].Members}
,([Measures].[Reseller Sales Amount]),desc
)
,5
) ON ROWS
from [BF_MDX]
效果:
4.Item函数以及综合运用一下上面的函数,
这个不太好理解,将就看吧
WITH
MEMBER [Measures].[Top Product Sales]AS{
TopCount(
[Date].[Calendar Year].currentmember*
[Product].[Product].[Product].Members,
1,
([Measures].[Internet Sales Amount])
)
*{[Measures].[Internet Sales Amount]}}.Item(0),FORMAT_STRING="Currency"
MEMBER [Measures].[Top Product Name]AS
{
TopCount(
[Date].[Calendar Year].currentmember*
[Product].[Product].[Product].members,
1,
([Measures].[Internet Sales Amount])
)
}.Item(0).item(1).name
SELECT{
([Measures].[Internet Sales Amount]),
([Measures].[Top Product Sales]),
([Measures].[Top Product Name]) } ON COLUMNS,
{
([Date].[Calendar Year].[CY 2001]): ([Date].[Calendar Year].[CY 2004])
} ON ROWS
FROM[BF_MDX]
效果: