原创

SSAS的MDX的基础函数(二)

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. 范围选取函数topcountbottomcount, headtail

}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]

效果:

  




正文到此结束
本文目录