计算成员和命名集,相当于sql中的变量和with List as(select ...)语句。CTE都是在一个查询里面动态生成对应的对象,供下面的语句使用。
计算成员:
查看cube中已存在的计算成员,以及allmember,或者AddCalculatedMembers
语法:
计算成员。 With member measures.XXXXX as 计算公式, format_string='fixed(保留两位小数) percent(百分比)等',solve_order=默认0(计算列运行的顺序,有时候计算列有相互影响)
计算成员注意事项:
1.计算成员不能成为另一个计算成员的子成员
2.如果要增加最终表格的列,那么应该把计算成员设置在measures集上
3.如果要增加最终表格的行,类似于给表格最下面加一个总计之类的。应该把计算成员建立在要显示的维度层次下。
示例:
with member
measures.BikePlusOne as [Measures].[Reseller Sales Amount] + 1
member
[Product].[Category].ClothingAndBikes as [Product].[Category].&[4] + [Product].[Category].&[1]
select {[Measures].[Reseller Sales Amount],measures.BikePlusOne} on 0,
{[Product].[Category].allmembers} on 1
from [BF_Cube1]
效果如下
![](https://i-blog.csdnimg.cn/blog_migrate/2034b8f199fa4fdc95357827e32a8aaa.png)
命名集:
语法:With set xxxx as 成员集
示例:
with member
measures.BikePlusOne as [Measures].[Reseller Sales Amount] + 1
member
[Product].[Category].ClothingAndBikes as [Product].[Category].&[4] + [Product].[Category].&[1]
set categories as {[Product].[Category].allmembers}
select {[Measures].[Reseller Sales Amount],measures.BikePlusOne} on 0,
categories on 1
from [BF_Cube1]
效果如下
![](https://i-blog.csdnimg.cn/blog_migrate/9c652b2bbd98fcf819eeea55a4a56652.png)
非常重要的一个函数
CurrentMember
返回遍历过程中指定层次结构的当前成员
它的属性有很多,比如
name,成员的名称
uniqueName,返回唯一标识路径
![](https://i-blog.csdnimg.cn/blog_migrate/f07460c6f9124b3bfe4c192b7694e879.png)
with
member measures.test as
[Product].[Category].currentmember.name
select{
measures.test
} on 0,
[Product].[Category].[Category].members on 1
from [BF_Cube1]
效果:
![](https://i-blog.csdnimg.cn/blog_migrate/91b07d4e574030795878e189ef5df834.png)
IIF函数示例
IIF是一个三元运算符
示例如下:
with
member measures.[Parent Member Name] AS
IIF(
[Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED(此处是强制转换,真实代码的括号不要)) = 0,
'根节点',[Product].[Product Categories].CurrentMember.Parent.Name
)
member measures.lvNum as [Product].[Product Categories].CurrentMember.Properties("Level_Number")
select
{
(measures.[Parent Member Name]),
measures.lvNum
} on 0,
{
[Product].[Product Categories].AllMembers
} on 1
from [BF_MDX]
效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/f790ac610639431668d3611c96e5c665.png)
练习1:显示销售额占父类销售额的百分比
示例:
with
member measures.[Parent Member Name] AS
IIF(
[Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED) = 0,
'根节点',[Product].[Product Categories].CurrentMember.Parent.Name
)
member measures.lvNum as [Product].[Product Categories].CurrentMember.Properties("Level_Number")
member measures.[Percent of Amount] as
(measures.[Reseller Sales Amount])/([Product].[Product Categories].CurrentMember.Parent,measures.[Reseller Sales Amount]),format_string='percent'
select
{
(measures.[Parent Member Name]),
measures.lvNum,
measures.[Reseller Sales Amount],
measures.[Percent of Amount]
} on 0,
{
[Product].[Product Categories].AllMembers
} on 1
from [BF_MDX]
效果:
![](https://i-blog.csdnimg.cn/blog_migrate/2d1ae2ba4c520a81fb57f0a48c228b10.png)
练习2:
完善练习1的度量值的iif函数(去掉null和inf)
with
member measures.[Parent Member Name] AS
IIF(
[Product].[Product Categories].CurrentMember.Properties("Level_Number",TYPED) = 0,
'根节点',[Product].[Product Categories].CurrentMember.Parent.Name
)
member measures.lvNum as [Product].[Product Categories].CurrentMember.Properties("Level_Number")
member measures.[Percent of Amount] as
IIF([Product].[Product Categories].CurrentMember.properties('Level_Number',typed) = 0
or measures.[Reseller Sales Amount] = null
,0,
(measures.[Reseller Sales Amount])/([Product].[Product Categories].CurrentMember.Parent,measures.[Reseller Sales Amount])),format_string='percent'
select
{
(measures.[Parent Member Name]),
measures.lvNum,
measures.[Reseller Sales Amount],
measures.[Percent of Amount]
} on 0,
{
[Product].[Product Categories].AllMembers
} on 1
from [BF_MDX]
效果:
![](https://i-blog.csdnimg.cn/blog_migrate/8a83da8d22b96579a355c306f0738d3f.png)
练习3,行小计有两种方法计算:
1)
select {
[Measures].[Internet Sales Amount]
} on 0,
non empty{
([Product].[Category].children) * ([Product].[Subcategory].children + [Product].[Subcategory].[All Products])
}on 1
from [BF_MDX]
效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/07fda65893b41189cdab3d32f0f7f893.png)
2)使用计算成员,作用域增加新的总计
with
member [Product].[Subcategory].[All Products].total as
(
[Product].[Subcategory].currentmember.parent
)
select {
[Measures].[Internet Sales Amount]
} on 0,
non empty{
([Product].[Category].children) * ([Product].[Subcategory].children + [Product].[Subcategory].[All Products].total)
}on 1
from [BF_MDX]
效果和第一个一样
一些更为强大的扩展
![](https://i-blog.csdnimg.cn/blog_migrate/ac5a8864c759c6eb24049948b91de717.png)
示例,取前面4个字符串:
with member measures.testName as
vbamdx!left([Product].[Category].currentmember.name,'4')
select {} on 0,
[Product].[Category].children on 1
from [BF_MDX]
效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/c2b987aaadb412221087286360b786f1.png)