SSAS的MDX中的计算成员和命名集

本文详细介绍了MDX(多维表达式)查询语言中的计算成员和命名集概念,包括它们的语法、用法及示例。计算成员用于创建动态的度量值,而命名集则允许定义一组成员进行操作。文中通过多个示例展示了如何使用CurrentMember函数、IIF函数以及如何计算占比和行小计。此外,还探讨了如何处理空值和无穷大值的问题。
摘要由CSDN通过智能技术生成

计算成员和命名集,相当于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]

效果如下

  

命名集:

语法: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]

效果如下

  

非常重要的一个函数

CurrentMember

返回遍历过程中指定层次结构的当前成员

它的属性有很多,比如

name,成员的名称

uniqueName,返回唯一标识路径

  
with
member measures.test as
[Product].[Category].currentmember.name

select{
measures.test
} on 0,
[Product].[Category].[Category].members on 1
from [BF_Cube1]

效果:

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]

效果如下:

    

练习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]

效果:

练习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]

效果:

练习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]

效果如下:

  

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]

效果和第一个一样

一些更为强大的扩展

  

示例,取前面4个字符串:

with member measures.testName as
vbamdx!left([Product].[Category].currentmember.name,'4')

select {} on 0,
[Product].[Category].children on 1
from [BF_MDX]

效果如下:

  
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值