MDX大部分常用函数

4. MDX函数列表
       函数分类和说明基本上是直接从SQLServer Analysis Service拷贝的。

4.1 维度函数
       表示返回值为Dimension的函数.

4.1.1 Dimension
返回包含指定的成员、级别或层次结构的维度。
语法
成员
«Member».Dimension
返回包含 «Member» 的维度。
级别
«Level».Dimension
返回包含 «Level» 的维度。
层次结构
«Hierarchy».Dimension
返回包含 «Hierarchy» 的维度。
4.1.2 Dimensions
返回由数值表达式或字符串表达式指定的维度。
语法
数字
Dimensions(«Numeric Expression»)
返回这样的维度,该维度在多维数据集中以零为基的位置是由 «Numeric Expression» 指定的。
说明  Measures 维度总由 Dimensions(0) 表示。
字符串
Dimensions(«String Expression»)
返回这样的维度,该维度的名称是由 «String Expression» 指定的。
注释
Dimensions 函数的字符串版本通常用于用户定义的函数。
示例
如果将 Time、Region 和 Product 维度添加到多维数据集(按照所列顺序),则下面的表达式将返回 Region:
Dimensions(2)
4.2 层级函数
       返回值为Hierarchy的函数。

注:实际上,在本文档中,我们比较少介绍Hierarchy的概念,因为我们建议一个维度只能有一个Hierarchy,这时,Hierarchy基本上等同于Dimension。因此,用户可以不用层级函数。

4.2.1 Hierarchy
返回包含指定的成员或级别的层次结构。

语法
成员
«Member».Hierarchy

返回包含 «Member» 的层次结构。

级别
«Level».Hierarchy

返回包含 «Level» 的层次结构。

示例
成员
[January].Hierarchy
该示例返回 Time。

级别
[Quarter].Hierarchy
该示例返回 Time。

4.3 级别函数
4.3.1 Level
返回成员的级别。

语法
«Member».Level

示例
如果 Time 维度有"(全部)"、Year、Quarter、Month、Week 和 Day 级别,则以下示例返回 Month 级别:

January.Level
下面的示例返回 Month 级别的名称:

January.Level.Name
4.3.2Levels
返回由数值表达式或字符串表达式指定的级别。

语法
数字
«Dimension».Levels(«Numeric Expression»)

返回其基于零的位置是由 «Numeric Expression» 指定的级别。

字符串
Levels(«String Expression»)

返回其名称是由 «String Expression» 指定的级别。

注释
字符串版本的 Levels 函数用于用户定义的函数。

示例
下面的示例假定 Time 维度有"(全部)"、Year、Quarter、Month、Week 和 Day 级别。

数字
以下示例返回 Quarter 级别:

Time.Levels(2)
字符串
以下示例返回 Year 级别:

Levels("Year")
 
4.4 成员函数
4.4.1 Ancestor
返回指定级别或指定距离上成员的祖先。

语法
级别
Ancestor(«Member», «Level»)

返回 «Level» 中指定的维度级别中的 «Member» 的祖先。

距离
Ancestor(«Member», «Numeric Expression»)

返回层次结构中与 «Member» 的距离为 «Numeric Expression» 个步骤的祖先。

示例
如果 Geography 维度包括级别 Country、State 和 City,下列函数将返回如下值。

表达式
 返回
 
Ancestor(Los Angeles, Country)
 [USA]
 
Ancestor(Los Angeles, State)
 [California]
 
Ancestor(Los Angeles, 0)
 [Los Angeles]
 
Ancestor(Los Angeles, 1)
 [California]
 
Ancestor(Los Angeles, 2)
 [USA]
 

 

4.4.2 ClosingPeriod
返回成员在指定级别上的后代中的最后一个兄弟。

语法
ClosingPeriod([«Level»[, «Member»]])

注释
如果指定 «Level»,则使用包含 «Level» 的维度,否则使用 Time 维度。如果没有指定 «Level»,则使用 «Member» 所在级别的下一级别。如果未指定 «Level» 或 «Member»,则默认设置为 Time.CurrentMember。

此函数等同于 BottomCount(Descendants(«Member», «Level»), 1)。

OpeningPeriod 函数与此函数类似,但返回第一个兄弟而不是最后一个兄弟。

示例
下例返回 [1991].December:

ClosingPeriod(Month, [1991])
4.4.3 Cousin
返回父成员下方与指定子成员具有相同的相对位置的子成员。

语法
Cousin(«Member1», «Member2»)

注释
此函数在级别内的成员顺序和位置上操作。如果有两个维度,第一个有四个级别,第二个有五个级别,则第一个维度第三级别的同代是第二个维度的第三级别。

示例
在下面的示例中,假定年份 1996 和 1994 在成员 March 之前都包含相同数目的月份:

Cousin([1996].March, [1994])
本例产生成员 [1994].March。

如果同一示例假定 1996 级别包含 January、February、March、April、May、June、July、August、September、October、November 和 December 成员,而 1994 级别包含 [1st Quarter]、[2nd Quarter]、[3rd Quarter] 和 [4th Quarter] 成员,则该示例返回 [1994].[3rd Quarter],因为它处于该级别内的同一相对位置(第三)。

4.4.4 CurrentMember
返回迭代过程中维度上的当前成员。

语法
«Dimension».CurrentMember

注释
在维度成员集合的迭代过程中,迭代过程的每一步中正在被操作的成员就是当前成员。此函数返回该成员。

示例
Time..CurrentMember
4.4.5DefaultMember
返回维度或层次结构的默认成员。

语法
维度
«Dimension».DefaultMember

层次结构
«Hierarchy».DefaultMember

注释
如果维度包含"(全部)"级别,则默认成员是"全部"成员。如果该属性是空的而维度或层次结构不包含"(全部)"级别,则默认成员是最高级别的任何成员。后一种情况下,DefaultMember 函数不明确,我们处理为计算后物理存储的第一个成员。

示例
维度
如果 Time 维度包含级别"(全部)"、Year、Quarter、Month 和成员 All-Time,则下面的表达式返回 All-Time:

Time.DefaultMember
层次结构
如果 [Fiscal Year] 层次结构包含级别 Quarter、Month 和成员 [Month 1],则下列表达式返回 [Month 1]:

[Fiscal Year].DefaultMember
4.4.6FirstChild
返回成员的第一个子代。

语法
«Member».FirstChild

示例
如果 Time 维度包含级别 Year、Quarter、Month、Week 和 Day,则下面的代码返回 January:

[1995].FirstChild
4.4.7FirstSibling
返回成员的父代的第一个子代。

语法
«Member».FirstSibling

示例
假定维度由月份组成,则下面的示例返回 January:

May.FirstSibling
4.4.8Lag
返回成员,该成员处在其所在维度中指定的成员之前指定的位数上。

语法
«Member».Lag(«Numeric Expression»)

注释
成员在维度中的位置由维度的自然顺序决定。位置的编号以零为基。

如果 «Numeric Expression» 为零,则返回 «Member»。如果 «Numeric Expression» 为负数,则返回其后的成员。

Lag(1) 等同于 PrevMember。Lag(-1) 等同于 NextMember。

«Member».Lead 函数与此类似,但是方向相反。Lag(n) 等同于 Lead(-n)。

示例
如果 Time 维度中的级别包括 Year 和 Month,则下面的示例返回 [1994].November:

[1995].February.Lag(3)
4.4.9LastChild
返回指定成员的最后一个子代。

语法
«Member».LastChild

示例
如果 Time 维度包含 Year、Quarter、Month、Week 和 Day,则下面的示例返回 December:

1995.LastChild
4.4.10LastSibling
返回指定成员的父代的最后一个子代。

语法
«Member».LastSibling

示例
如果父代级别为 quarters,则以下示例返回 June:

May.LastSibling
4.4.11Lead
返回成员,该成员处在其所在维度中指定的成员后指定的位数上。

语法
«Member».Lead(«Numeric Expression»)

注释
成员在维度中的位置由维度的自然顺序决定。位置的编号以零为基。

如果 «Numeric Expression» 为零,则返回 «Member»。如果 «Numeric Expression» 为负数,则返回前面的成员。

Lead(1) 等同于 NextMember。Lead(-1) 等同于 PrevMember。

«Member».Lag 函数与此类似,但方向相反。Lead(n) 等同于 Lag(-n)。

示例
如果 Time 维度中的级别包括 Year 和 Month,则下面的示例返回 [1995].February:

[1994].November.Lead(3)
4.4.12NextMember
返回指定成员所在级别的下一个成员。

语法
«Member».NextMember

注释
NextMember 函数返回与 «Member» 中所指定的成员位于同一级别的下一个成员。

示例
如果 Year 级别是由名为 [1994]、[1995] 和 [1996] 的成员组成,则下例返回 [1995]:

[1994].NextMember
4.4.13 OpeningPeriod
返回某一指定级别的后代中的第一个兄弟,或者某一指定成员的后代中的第一个兄弟。

语法
OpeningPeriod([«Level»[, «Member»]])

注释
如果指定 «Level»,则使用包含 «Level» 的维度,否则使用 Time 维度。如果没有指定 «Level»,则使用 «Member» 所在级别的下一级别。如果未指定 «Level» 和 «Member»,则默认设置为 Time.CurrentMember。

此函数等同于 TopCount(Descendants(«Member», «Level»), 1)。

ClosingPeriod 函数与此类似,但返回最后一个兄弟而非第一个兄弟。

示例
下例返回 [1991].January:

OpeningPeriod(Month, [1991])
4.4.14 ParallelPeriod
返回上一时期中与指定成员具有相同的相对位置的成员。

语法
ParallelPeriod([«Level»[, «Numeric Expression»[, «Member»]]])

注释
此函数类似于 Cousin 函数,但与 Time 系列的关系更密切。它在 «Level»(称作 ancestor)中提取 «Member» 的祖先,然后提取滞后 «Numeric Expression» 的 ancestor 的兄弟,并返回那个兄弟后代中 «Member» 的并行时期。

此函数有如下默认值:

•如果没有指定 «Level»,则 «Member» 值默认为 Time.CurrentMember。否则就是 dimension.CurrentMember,其中 dimension 是 level 所属的维度。
•«Numeric Expression» 默认为 1。
•«Level» 默认为 «Member» 的父代级别。
此函数等同于 Cousin(Member,Lag(Ancestor(Member,Level),Numeric Expression)。

示例
下表列出如何使用此函数的各种示例。

表达式
 返回
 
ParallelPeriod(Year,2,
[96 Qtr 3])
 [94 Qtr 3]
 
ParallelPeriod(Year,2)
 Time.CurrentMember 两年前的并行时期。

即,如果 Time.CurrentMember 是 [1993June],则返回的成员是 [1991June]。
 
ParallelPeriod(Year)
 Time.CurrentMember 一年前的并行时期。

即,如果 Time.CurrentMember 是 [1993June],则返回的成员是 [1992June]。
 
ParallelPeriod()
 Time.CurrentMember 父代的前一个兄弟中的并行时期。

例如,如果 Time.CurrentMember 是 [1993June],则返回的成员是 [1993March]。[1993June] 的父代是 Quarter2,它的前一个兄弟是 Quarter1,Quarter1 中的并行时期是 [1993March]。
 

4.4.15 Parent
返回成员的父代。

语法
«Member».Parent

注释
此函数返回在 «Member» 中指定的成员的父成员。

示例
如果 Geography 维度包括 State 和 Country,则以下示例返回 USA:

California.Parent
4.4.16 PrevMember
返回指定成员所在级别的上一个成员。

语法
«Member».PrevMember

注释
此函数返回与 «Member» 中所指定的成员位于同一级别的前一个成员。

示例
如果 Year 级别是由 [1994]、[1995] 和 [1996] 组成的,则下例返回成员 [1995]:

[1996].PrevMember
4.4.17 StrToMember
返回具有多维表达式 (MDX) 格式的字符串表达式中的成员。

语法
StrToMember(«String Expression»)

返回具有 MDX 格式的字符串中的成员,该字符串应包含有成员,并在 «String Expression» 中指定。

注释
StrToMember 函数通常用于用户定义的函数。

示例
下例返回成员 Time.[1996]:

StrToMember("Time.[1996]")


4.5 集合函数
       返回集合的函数。

4.5.1 Ancestors
返回指定级别或距离的成员的所有祖先的集合。

语法
级别
Ancestors(«Member», «Level»)

返回 «Level» 中指定级别的 «Member» 的所有祖先。

返回成员的集合必须全部来自同一层次结构,但是 «Level» 不必是与 «Member» 同一层次结构的级别。

距离
Ancestors(«Member», «Numeric Expression»)

返回层次结构中 «Member» 之上 «Numeric Expression» 个步骤的层次结构的所有成员。Ancestors 函数的这一形式适用于父代级别未知或无法命名的情况。返回成员的集合必须都来自同一层次结构。

说明  Ancestors(«Member», 0) 返回 «Member»。

注释
与 Ancestor 函数不同,Ancestors 是一个集合值表达式;它返回的是一个集合而不是一个成员。

示例
如果 Geography 维度包括级别 Country、State 和 City,下列函数将返回如下值。

表达式
 返回
 
Ancestors([Los Angeles], Country)
 { USA }
 
Ancestors([Los Angeles], State)
 { California }
 
Ancestors([Los Angeles], 0)
 { [Los Angeles] }
 
Ancestors([Los Angeles], 1)
 { California }
 
Ancestors([Los Angeles], 2)
 { USA }
 

 

4.5.2 Ascendants
返回指定成员的祖先集合。

语法
Ascendants(«Member»)

注释
Ancestor 函数返回特定级别上的一个特定的祖先成员或祖先,而 Ascendants 函数则不同,它对成员的层次结构执行后序遍历,并且在集合中返回与给定成员相关的所有祖先成员,包括其自身。

示例
下例返回集合 { LA, California, USA, [All Locations] }:

Ascendants([Los Angeles])
4.5.3 BottomCount
从集合底端开始返回指定数目的项,可以选择首先对集合排序。

语法
BottomCount(«Set», «Count»[, «Numeric Expression»])

注释
此函数根据 «Numeric Expression» 的值对集合进行排序,然后返回底端 «Count» 成员,其中的 «Count» 是一个数值表达式。

重要  与 TopCount 函数相似,BottomCount 函数总是打破层次结构。

示例
BottomCount(Geography.Cities.Members, 5, Sales)
4.5.4 BottomPercent
对集合排序并返回指定数目的最底部的元素,这些元素的累积合计至少为指定的百分比。

语法
BottomPercent(«Set», «Percentage», «Numeric Expression»)

注释
此函数对在 «Set« 中指定的集合进行排序,并返回其 «Numeric Expression» 的累积合计至少为 «Percentage» 的指定数量的最底端元素。«Percentage» 是一个数值表达式。

重要  与 TopPercent 函数相似,BottomPercent 函数总是打破层次结构。

示例
BottomPercent(Products.[Product Description].Members, 25, Sales)
4.5.5 BottomSum
使用数值表达式对集合排序,并返回指定数量的最底端元素,这些元素的和至少为指定的值。

语法
BottomSum(«Set», «Value», «Numeric Expression»)

注释
此函数按 «Numeric Expression« 进行排序并挑选最底端的 n(可能的最小数)个元素,这些元素的和至少是 «Value»。

重要  与 TopSum 函数相似,BottomSum 函数总是打破层次结构。

示例
BottomSum(Products.[Product Description].Members, 100000, Quantity)
4.5.6 Children
返回成员的子代。

语法
«Member».Children

示例
下列代码返回 { Nebraska, Oklahoma, Montana }:

[Geography].[All Geography].[Central Region].Children
4.5.7 Crossjoin
返回两个集合的矢量积。

语法
Crossjoin(«Set1», «Set2»)

替代语法
«Set1» * «Set2»

注释
所得集合中元组的顺序取决于 «Set1» 和 «Set2» 的顺序,以及其成员的顺序。

如果 «Set1» = {x1, x2,...,xn} 并且 «Set2» = {y1, y2, ..., yn},则 Crossjoin(Set1, Set2) 为:

{(x1, y1), (x1, y2),...,(x1, yn), (x2, y1), (x2, y2),...,

(x2, yn),..., (xn, y1), (xn, y2),..., (xn, yn)}

示例
下例返回 {([1994], USA), ([1994], Japan), ([1995], USA), ([1995], Japan)}:

CrossJoin({[1994], [1995]}, {USA, Japan})
4.5.8 Descendants
返回某一成员在指定级别或距离上的后代集合,可以选择包含或不包含其它级别上的后代。

语法
级别
Descendants(«Member», [«Level»[, «Desc_flags»]])

返回成员的后代集合,该成员由 «Member» 指定,位于 «Level» 所指定的级别,并且可以选择由 «Desc_flags» 中指定的标志进行修改。

如果没有指定 «Level» 或 «Desc-flags» 参数,则函数的语法如下:

Descendants(«Member», «Member».Level, SELF_BEFORE_AND_AFTER)

距离
Descendants(«Member», «Distance»[, «Desc_flags»])

返回成员的后代,而该成员由 «Member»(在层次结构中有 «Distance» 个步骤)指定,并且可以选择由 «Desc_flags» 中指定的标志进行修改。此语法通常用于处理不齐整层次结构。指定 «Distance» 为 0 将返回一个只包含 «Member» 中指定的成员的集合。

标志
标志
 描述
 
SELF
 默认值。只从 «Level» 中返回后代成员。当且仅当指定的 «Level» 是 «Member» 的级别时,才包括 «Member»。
 
AFTER
 从所有从属于 «Level» 的级别中返回后代成员。
 
BEFORE
 返回 «Member» 和 «Level» 之间所有级别的后代成员,不包括来自 «Level» 的成员。
 
BEFORE_AND_AFTER
 从所有从属于 «Member» 的级别的所有级别中返回后代成员,不包括来自 «Level» 中的成员。
 
SELF_AND_AFTER
 返回 «Level» 中和 «Level» 的所有从属级别中的后代成员。
 
SELF_AND_BEFORE
 返回 «Level» 中和 «Member» 与 «Level» 之间所有级别中的后代成员。
 
SELF_BEFORE_AFTER
 返回所有从属于 «Member» 级别的所有级别的后代成员。
 
LEAVES
 返回在 «Member» 及 «Level» 或 «Distance» 之间的叶后代成员。
 

 

注释
默认情况下,只包含指定级别或距离上的成员。此函数与 SELF 的 «desc_flag» 值相对应。通过更改 «desc_flags» 的值,可以包含或不包含位于指定级别或距离的后代、指定级别或距离之前或之后(直到叶节点为止)的子代、以及与指定的级别或距离无关的所有叶子代。

示例
假定 Location 维度中级别的命名为(按照层次结构顺序)Countries(国家)、States(州)、Counties(县)和 Cities(城市)。

表达式
 返回
 
Descendants(USA)
 美国 (USA) 的所有州 (State)、县 (County) 和城市 (City)
 
Descendants(USA, Counties)
 美国 (USA) 的所有县 (County)
 
Descendants(USA, Counties, SELF)
 美国 (USA) 的所有县 (County)
 
Descendants(USA, Counties, BEFORE)
 美国 (USA) 的所有州 (State)
 
Descendants(USA, Counties, AFTER)
 美国 (USA) 的所有城市 (City)
 
Descendants(USA, Counties, BEFORE_AND_AFTER)
 美国 (USA) 的所有州 (State) 和城市 (City)
 
Descendants(USA, Counties, SELF_BEFORE_AFTER)
 美国 (USA) 的所有州 (State)、县 (County) 和城市 (City)
 
Descendants(USA, States, LEAVES)
 美国 (USA) 的所有州 (State) 以及国家 (Country) 级别和州 (State) 级别间的任何叶成员。
 
Descendants(USA, 1)
 美国 (USA) 的所有州 (State)
 
Descendants(USA, 2, SELF_BEFORE_AFTER)
 美国 (USA) 的所有州 (State)、县 (County) 和城市 (City)
 

4.5.9 Distinct
返回一个集合,并从指定集合中删除重复的元组。

语法
Distinct(«Set»)

注释
从尾部删除重复的元组。

示例
下例返回 {(a,b), (c,d )}:

Distinct({(a,b), (c,d), (a,b)})
4.5.10 Except
查找两个集合之间不同的项,可以选择保留重复项。

语法
Except(«Set1», «Set2»[, ALL])

注释
在查找不同的项之前先消除两个集合中的重复项。可选的 ALL 标志保留重复项。清除 «Set1» 中的匹配重复项并保留非匹配重复项。

示例
示例

Except({Canada, [British Columbia], Mexico, [British Columbia], USA, Washington}, {Canada, Mexico, California})
返回

{[British Columbia], USA, Washington}
示例

Except({Canada, [British Columbia], Mexico, [British Columbia], USA, Washington}, {Canada, Mexico, California}, ALL)
返回

{[British Columbia], [British Columbia], USA, Washington}.
4.5.11 Filter
返回根据搜索条件对指定集合进行筛选所得到的集合。

语法
Filter(«Set», «Search Condition»)

注释
Filter 函数对 Set 中指定的集合的每个成员,评估多维表达式 (MDX) 逻辑表达式(该表达式在 Search Condition 中指定),并返回满足搜索条件的成员集合。

Filter 函数的工作方式与 IIf 函数的类似。IIf 函数仅返回两个选项中的一个,返回其中哪个取决于 MDX 逻辑表达式的取值,而 Filter 函数返回满足指定搜索条件的一组成员。实际上,Filter 函数对该集合中的每个成员执行 IIf(«Search Criteria», «Member», NULL),并返回所得结果。如果所有成员都不满足搜索条件,则返回空集。

示例
如果这些城市从 1995 到 1996 级别的销售额下降,则以下示例返回 {Paris, Buffalo}:

Filter(SampleSet, (Sales,[1996]) < (Sales, [1995]))
4.5.12 Generate
将集合应用到另一集合的每个成员,然后用 union 运算合并所得的集合。或者,返回一个在某个集合上计算字符串表达式所得的值创建的串联字符串。

语法
集合
Generate(«Set1», «Set2»[, ALL])

字符串
Generate(«Set», «String Expression»[, «Delimiter»])

注释
此函数的集合版本将 «Set2» 应用于 «Set1» 的每个成员,然后用 union 运算合并所得的集合。如果指定了 ALL,结果中将保留重复项。

此函数的字符串版本迭代于 «Set» 中指定的集合的每个成员,对成员计算字符串表达式(在 «String Expression» 中指定)的值,然后将结果串联成返回字符串。或者,可以用 «Delimiter» 提供字符串表达式(即用分隔符来分隔串联返回字符串中的每个结果),从而对字符串进行分隔。

示例
集合
Generate({USA, France}, Descendants(Geography.CurrentMember, Cities))
此函数对集合 {USA, France} 中的每个成员应用表达式 Descendants(Geography.CurrentMember, Cities)。每应用于一个成员便产生一个集合。(应用于 USA 将生成美国 (USA) 所有城市的集合;应用于 France 将生成法国 (France) 所有城市的集合。)这些集合通过 union 运算合并以返回此函数的结果。本例中,美国和法国的所有城市就是结果。通常,Generate(«Set1», «set_expression») 将把 «set_expression» 应用于 «Set1» 的每个成员,然后用 union 运算合并所得的结果。

如果通过 CurrentMember,«Set1» 与 «set_expression» 无关,那么 Generate 生成 «set_expression» 所指的集合的简单复制,它包含的复制与 «Set1» 中的元组一样多。如果指定了可选的 ALL 标志,结果中将保留所有重复项。如果未指定 ALL,重复项将被删除。例如:

Generate({USA, FRANCE}, {SEATTLE, BOSTON}, ALL)
返回集合

{SEATTLE, BOSTON, SEATTLE, BOSTON}.
但如果未指定 ALL,那么返回的集合是

{SEATTLE, BOSTON}.
字符串
以下示例返回字符串 "19971998":

Generate( {Time.[1997], Time.[1998]}, Time.CurrentMember.Name)
以下示例返回字符串 "1997 and 1998":

Generate( {Time.[1997], Time.[1998]}, Time.CurrentMember.Name, " and ")
4.5.13 Head
返回集合中指定数目的前若干个元素。

语法
Head(«Set»[, «Numeric Expression»])

注释
此函数返回集合中前 «Numeric Expression» 个元素。保留元素的顺序。«Numeric Expression» 的默认值是 1。如果 «Numeric Expression» 小于 1,则返回空集合。如果 «Numeric Expression» 超出了集合中元组的个数,则返回原始的集合。

示例
以下示例返回集合 {USA, Canada, France}:

Head({USA, Canada, France, Germany, Japan}, 3)
4.5.14 Hierarchize
在层次结构中对集合的成员排序。

语法
Hierarchize(«Set»[, POST])

注释
此函数在层次结构中对 «Set» 的成员排序。除非使用 POST 关键字,否则当未指定其它排序条件时,级别中的成员按其自然顺序排序,这是维度上的成员的默认排序顺序。POST 关键字使用后采用后序排序,即以后序方式遍历层级树。

Hierarchize 始终保留重复项。

示例
示例

Hierarchize(SampleSet)
按自然顺序返回集合。按层次结构排列的数据集如下所示(假定数据源的自然顺序是按字母排列):

France
 
 
 
 
 
 Nice
 
 
 
 Paris
 
UK
 
 
 
 
 
 London
 
USA
 
 
 
 
 California
 
 
 
 
 LA
 
 
 
 Buffalo
 
 
 
 NYC
 


4.5.15 Intersect
返回两个输入集合的交集,可以选择保留重复项。

语法
Intersect(«Set1», «Set2»[, ALL])

注释
此函数返回 «Set1» 和 «Set2» 的交集。根据默认设置,在相交之前先删除两个集合中的重复项。

可选的 ALL 保留重复项。ALL 有几种工作方式。算法是:不重复的元素照常相交。对于 «Set1» 中的每个重复项,将其与 «Set2» 中的重复项相匹配,如果存在匹配的项,则在交集中保留匹配的重复项。

示例
示例

Intersect({[1994], [1995], [1996]}, {[1995], [1996], [1997]})
返回集合 {[1995], [1996]}。

4.5.16 Members
返回维度、级别或层次结构中成员的集合。

语法
维度
«Dimension».Members

此语法返回 «Dimension» 中所有成员的集合。

层次结构
«Hierarchy».Members

此语法返回 «Hierarchy» 中所有成员的集合。

级别
«Level».Members

该语法返回维度中指定级别上所有成员的集合。

示例
维度
示例

Geography.Members
返回 Geography 维度中所有成员的集合。

层次结构
示例

Time.Quarterly.Members
返回 Time 维度的 Quarters 层次结构中所有成员的集合。

级别
如果 Year 级别包含 [1994]、[1995] 和 [1996],则该示例返回集合 {[1994], [1995], [1996]}:

Year.Members

4.5.17Mtd
返回 Time 维度 Month 级别上的成员集合,从第一个时期开始到指定的成员为止。

语法
Mtd([«Member»])

注释
Mtd 函数是 PeriodsToDate 函数的快捷函数,它将函数的 «Level» 参数定义为 Month。如果未指定成员,则根据默认设置是 Time.CurrentMember。

Mtd(«Member») 等同于 PeriodsToDate(Month,«Member»)。

示例
下例将返回 1997 年 9 月的头五天。

MTD([05-Sep-1997])
4.5.18NonEmptyCrossjoin
以一个集合的形式返回两个或多个集合的矢量积,不包括空元组以及无相关事实数据表数据的元组。

语法
NonEmptyCrossjoin(«Set1», «Set2»[, «Set3»...][, «Crossjoin Set Count»])

注释
NonEmptyCrossjoin 函数以一个集合的形式返回两个或多个集合的矢量积,不包括空元组或无基础事实数据表提供的数据的元组,因此所有计算成员均被自动排除。如果未指定 Crossjoin Set Count,则所有指定的集合将交叉联接,而且从所得集合中排除空成员。如果已指定 «Crossjoin Set Count»,则交叉联接以 «Set1» 开头的 «Crossjoin Set Count»。剩余集合用于确定在所得交叉联接集合中哪些成员是非空的。

例如,您要查看参加 Big Time Savings 促销的 Beverly Hills 每个商店的单位总销售额,但仅想查看位于 California 的那些客户的总销售额。但是,下列多维表达式 (MDX) 语法返回一个集合,该集合包含在 California 所有城市的单位总销售额,是按 Beverly Hills 的商店对客户进行分组的,而且都参加了 Big Time Savings 促销;该集合是三个集合的矢量积。所返回的单位销售额仅是三个集合的矢量积;未返回参加 Big Time Savings 促销的 Beverly Hills 的商店的总销售额,而仅是参加促销本身的每个商店或客户城市的各个单位销售额。

NonEmptyCrossJoin([Store].[Beverly Hills].Children, [Customers].[CA].Children, {[Promotions].[Big Time Savings]})
上面的示例范围太窄,无法完成任务。相反,下列 MDX 语句仅交叉联接前两个集合,而且从返回的集合中删除了非空成员。因为未使用 {[Promotions].[Big Time Savings]},所以下一 MDX 语句范围太宽;MDX 语句包含太多元组,无法完成目标。

NonEmptyCrossJoin([Store].[Beverly Hills].Children, [Customers].[CA].Children)
下列 MDX 语句使用 Crossjoin Set Count 参数返回一个集合,该集合包含 California 所有城市的单位销售额,而且按 Beverly Hills 的商店对客户进行分组;该集合是前两个集合的矢量积。但是,只返回了参加 Big Time Savings 促销的交叉联接集合中的那些成员,所以完成了任务。在 Crossjoin Set Count 参数中指定的前两个集合交叉联接,而第三个集合用于在确定交叉联接集合成员是否包含数据时确定应考虑交叉联接集合的哪些成员。

NonEmptyCrossJoin([Store].[Beverly Hills].Children, [Customers].[CA].Children, {[Promotions].[Big Time Savings]},2)
NonEmptyCrossjoin 函数的好处是处理涉及两个以上集合的交叉联接时更快、更有效,而且函数所提供的语法更简单。使用下列 MDX 语句中所示的 Filter、Crossjoin 和 IsEmpty 函数也可获得相同结果,但效率较低:

Filter(Crossjoin([Store].[Beverly Hills].Children, [Customers].[CA].Children), NOT IsEmpty([Promotions].[Big Time Savings])
当添加其它集合时,使用 Filter、Crossjoin 和 IsEmpty 就变得不太实际,因为每个 Crossjoin 语句嵌套在另一个 Crossjoin 语句中才能返回相同结果。例如,使用 NonEmptyCrossjoin 将 [Product].Children 集合添加到返回的集合中类似于:

NonEmptyCrossJoin([Store].[Beverly Hills].Children, [Customers].[CA].Children, [Product].Children, {[Promotions].[Big Time Savings]}, 3)
在另一方面,使用 Filter、Crossjoin 和 IsEmpty 函数执行相同功能与下列类似:

Filter(Crossjoin(Crossjoin([Store].[Beverly Hills].Children, [Customers].[CA].Children), [Product].Children), NOT IsEmpty([Promotions].[Big Time Savings]))
前一 MDX 语句在执行时比较慢,而且易读性比其基于 NonEmptyCrossjoin 的对应语句要差。

示例
下列语句返回一个集合,该集合包含 California 所有城市的全部单位销售额,而且按参加 Big Time Savings 促销的 Beverly Hills 的商店对客户进行分组:

NonEmptyCrossJoin([Store].[Beverly Hills].Children, [Customers].[CA].Children, {[Promotions].[Big Time Savings]},2)
请参见
4.5.19 Order
排列指定集合的成员,可以选择保留或打破层次结构。

语法
Order(«Set», {«String Expression» | «Numeric Expression»}
[, ASC | DESC | BASC | BDESC])

注释
Order 有两种变化形式:按层次结构排列(ASC 或 DESC)和不按层次结构排列(BASC 或 BDESC,其中 B 代表打破层次结构)。按层次结构排列的排序首先按成员在层次结构中的位置对其进行排序,然后再对每个级别进行排序。而不按层次结构排列的排序在对集合中的成员排序时不考虑层次结构。如果没有明确说明,则根据默认设置使用 ASC。

示例
示例

Order(SampleSet, ([1995], Sales), DESC)
按层次结构排列所有成员然后按 Sales 排序每个级别。在构造排序后的列表时,比较最高级别上的 Sales。因此,如果 California 的所有城市的 Sales 合计低于 New York 的所有城市的 Sales 合计,在按降序排列的列表中,California 和 California.LA 将排在 NYC 的下面。

该示例的结果

Order(SampleSet, ([1995], Sales), DESC)
在下表中列出。

位置
 
 
 1995 年销售数据
 
USA
 
 
 5000
 
 
 California
 
 2000
 
 
 
 LA
 500
 
 
 
 Buffalo
 300
 
 
 
 NYC
 900
 
France
 
 
 2500
 
 
 
 Paris
 365
 
 
  
 Nice
 27
 
UK
 
 
 1900
 
 
 
 London
 250
 

 

下面的表达式在按成员的值排序成员时不考虑它们在成员层次结构中的相对位置。在本例中,按每个城市的 1995 年销售数据排序数值,包括按州和国家/地区计算的累积销售数据:

Order(SampleSet, ([1995], Sales), BDESC)
下表显示上一个表达式的结果。

位置
 1995 年销售数据
 
USA
 5000
 
France
 2500
 
California
 2000
 
UK
 1900
 
NYC
 900
 
LA
 500
 
Paris
 365
 
Buffalo
 300
 
London
 250
 
Nice
 27
 

 

说明  如果输入的集合中有两个元素,这两个元素的 «String Expression» 或 «Numeric Expression» 有相同的值,则保留输入顺序。

例如,如果 USA 和 Europe 的销售额各为 300,而 Asia 的销售额为 100,则以下表达式返回的是集合 {Asia, USA, Europe},而不是集合 {Asia, Europe, USA}:

Order({USA, Europe, Asia}, Sales, BASC)
4.5.20 PeriodsToDate
返回指定级别上的一个时期(成员)集合,从第一个时期开始到指定的成员为止。

语法
PeriodsToDate([«Level»[, «Member»]])

注释
在 «Level» 作用域内,此函数返回处于 «Member» 级别上的时期的集合,该集合以第一个时期开始,以 «Member» 结束。如果没有指定级别或成员,则 «Member» 的值就为 Time.CurrentMember,并且 «Level» 为 Time.CurrentMember 的父代级别。如果指定了级别,则 «Member» 为 dimension.CurrentMember,其中的 dimension 是 «Level» 的维度。

示例
下表列出可以使用 PeriodsToDate 的各种方法。

表达式
 返回
 
PeriodsToDate(Quarter,
[05-Sep-1997])
 从 Quarter3 开始的天数的集合。
 
PeriodsToDate(Year, March)
 集合 {January, February, March}。
 
PeriodsToDate(Year)
 从 Time.CurrentMember 的祖先所在的年份开始一直到 Time.CurrentMember 为止的成员的集合。
 
PeriodsToDate()
 从 Time.CurrentMember 的时期所在的级别开始一直到 Time.CurrentMember 为止的成员的集合。所有返回的成员与 Time.CurrentMember 位于同一级别上。
 

 

PeriodsToDate(level,member) 与 TopCount(Descendants(Ancestor(member, level),member.Level), 1):member 相同

4.5.21 Qtd
返回 Time 维度 Quarter 级别上的成员集合,从第一个时期开始到指定的成员为止。

语法
Qtd([«Member»])

注释
PeriodsToDate 函数的这个快捷函数将 PeriodsToDate 函数的 «Level» 参数预定义为 Quarter。如果未指定成员,则根据默认设置是 Time.CurrentMember。

Qtd(«Member») 等同于 PeriodsToDate(Quarter,«Member»)。

示例
下例将返回从 1997 年第三季度开始的天数的集合:

Qtd([05-Sep-1997]))
4.5.22 Siblings
返回指定成员的兄弟,包括成员本身。

语法
«Member».Siblings

示例
下例返回集合 { January, February, March }:

[Time].[All Time].[1998].[Quarter 1].[January].Siblings
4.5.23 Subset
从指定集合中返回元组的子集。

语法
Subset(«Set», «Start»[, «Count»])

注释
此函数从 «Set» 中返回 «Count» 元组,并作为一个集合,该集合从 «Start» 位置开始。«Start» 是以零为基:0 对应于集合中的第一个元组,1 对应于第二个元组,依此类推。如果没有指定 «Count»,则返回从集合 «Start» 开始到集合末尾的所有元组。

示例
下例返回集合 {USA, Canada}:

Subset({USA, Canada, France, Germany, Japan, England, Peru}, 0, 2)
4.5.24 Tail
从集合尾部返回子集。

语法
Tail(«Set»[, «Count»])

注释
此函数返回集合中后面 «Count» 个元素。保留元素的顺序。«Count» 的默认值为 1。如果 «Count» 小于 1,则返回空集合。如果 «Count» 超出了集合中元组的个数,则返回原始的集合。

示例
以下代码返回集合 {France, Germany, Japan}:

Tail({USA, Canada, France, Germany, Japan}, 3)
4.5.25 TopCount
从指定集合的顶端成员开始,返回指定数目的项目,可以选择首先对集合排序。

语法
TopCount(«Set», «Count»[, «Numeric Expression»])

注释
此函数根据 «Numeric Expression» 的值对集合进行排序,然后返回顶端 «Count» 成员,其中的 «Count» 是一个数值表达式。

重要  与 BottomCount 函数相似,此函数总是打破层次结构。

示例
Topcount(Geography.Cities.Members, 5, Sales)
4.5.26 TopPercent
对集合排序并返回最顶端的元素,这些元素的累积合计至少为指定的百分比。

语法
TopPercent(«Set», «Percentage», «Numeric Expression»)

注释
此函数使用 «Numeric Expression» 对集合进行排序,并返回其 «Numeric Expression» 的累积合计至少为 «Percentage» 的顶端 n 个元素。«Percentage» 是一个数值表达式。

重要  与 BottomPercent 函数相似,此函数总是打破层次结构。

示例
TopPercent({London, Paris, Rome, New York, Seattle, Tokyo}, 15, Sales)
4.5.27 TopSum
对集合排序并返回最顶端的元素,这些元素的累积合计至少为指定的值。

语法
TopSum(«Set», «Value», «Numeric Expression»)

注释
此函数在 «Numeric Expression» 上排序并挑选顶端的 n(可能的最小数)个元素,这些元素的累积合计至少是 «Value»。

重要  与 BottomSum 函数相似,此函数总是打破层次结构。

示例
Topsum(Products.[Product Description].Members, 100000, Quantity)
4.5.28 Union
返回对两个集合进行 union 运算所生成的集合,可以保留重复的成员。

语法
Union(«Set1», «Set2»[, ALL])

注释
此函数返回 «Set1» 和 «Set2» 的 union 运算结果,并在默认情况下消除重复项。ALL 标志表示在并集中保留重复项。从尾部删除重复项。

Union(USA.Children, CANADA.Children, ALL)
4.5.29 Wtd
返回 Time 维度 Week 级别上的成员集合,从第一个时期开始到指定的成员为止。

语法
Wtd([«Member»])

注释
Wtd 函数是 PeriodsToDate 函数的快捷函数,它将 PeriodsToDate 函数的 «Level» 参数定义为 Week。如果未指定成员,则默认为 Time.CurrentMember。

Wtd(«Member») 等同于 PeriodsToDate(Week,«Member»)。

示例
下面的示例将返回从一周的开始到当前日的天数:

Wtd(Day)
4.5.30 Ytd
返回 Time 维度 Year 级别上的成员集合,从第一个时期开始到指定的成员为止。

语法
Ytd([«Member»])

注释
Ytd 函数是 PeriodsToDate 函数的快捷函数,它将 PeriodsToDate 函数的 «Level» 参数定义为 Year。如果未指定成员,则根据默认设置是 Time.CurrentMember。

Ytd(«Member») 等同于 PeriodsToDate(Year,«Member»)。

示例
下例将返回从 Time.CurrentMember 祖先的起始年到 Time.CurrentMember 的成员集合:

Ytd()
4.5.31 :
    返回处于成员对之间的成员集合.

    语法
<Member>:<Member>

注释
    两个Member所属的Level必须相同.

示例
下例将返回从 Time.[2000].[1]到Time.[2000].[5]之间的成员集合.

    Time.[2000].[1]: Time.[2000].[5]

4.6 逻辑函数
4.6.1 IsEmpty
如果表达式的值为空单元值,则返回 TRUE,否则返回 FALSE。

语法
IsEmpty(«Value Expression»)

示例
如果 Measures.CurrentMember 是空单元,则以下示例返回 TRUE:

IsEmpty(Measures.CurrentMember)
4.6.2 And
   逻辑与.

<Logical Expression> AND <Logical Expression>

4.6.3 Or
逻辑或.

<Logical Expression> OR <Logical Expression>

4.6.4 Not
逻辑非.

<Logical Expression> OR <Logical Expression>

4.6.5 Xor
逻辑异或.

<Logical Expression> XOR <Logical Expression>

4.6.6 >
    比较大小.两个版本:

    <Numeric Expression> > <Numeric Expression>

    <String> > <String>

4.6.7 >=
    比较大小.两个版本:

    <Numeric Expression> >= <Numeric Expression>

    <String> >= <String>

4.6.8 <
    比较大小.两个版本:

    <Numeric Expression> < <Numeric Expression>

    <String> < <String>

4.6.9 <=
    比较大小.两个版本:

    <Numeric Expression> <= <Numeric Expression>

    <String> <= <String>

4.6.10 <>
    比较大小.两个版本:

    <Numeric Expression> <> <Numeric Expression>

    <String> <> <String>

4.6.11 =
比较大小.两个版本:

    <Numeric Expression> = <Numeric Expression>

    <String> = <String>

4.7 数值函数
4.7.1 Aggregate
返回根据成员的聚合类型,用适当的聚合函数计算所得的值。

语法
Aggregate(«Set»[, «Numeric Expression»])

示例
在下面的表达式中,先用度量值 SumSales 显示计算成员 Total,然后再用度量值 MaxSales 显示计算成员 Total。在前一种情况下,Total 是通过加法(使用 Sum)计算得到的。在后一种情况下,Total 是通过取最大值计算得到的。

WITH MEMBER Geography.Total AS  'AGGREGATE({USA, France})'
SELECT {Measures.SumSales, Measures.MaxSales} ON COLUMNS,
      {USA, France, Total} ON ROWS
FROM SalesCube
WHERE ([1998])
4.7.2 Avg
返回在某一集合上对数值表达式求得的平均值。

语法
Avg(«Set»[, «Numeric Expression»])

注释
此函数需要单元数的隐性计数,不包含空单元。若要强制包含空单元,应用程序必须使用 CoalesceEmpty 函数。

示例
如果 Sales 分别为 1000、2000 和 3000,则下面的函数返回 2000:

Avg({USA, Canada, Mexico}, Sales)
4.7.3CoalesceEmpty
将空单元值合并为数字或字符串并返回合并后的值。

语法
数值
CoalesceEmpty(«Numeric Expression»[, «Numeric Expression»]...)

字符串
CoalesceEmpty(«String Expression»[, «String Expression»]...)

注释
此函数返回值表达式列表中的第一个(左侧)非空的值表达式。如果所有的值表达式都取值为空单元值,则返回空单元值。

所有值表达式都必须取值为数值数据类型或空单元值。或者,所有值表达式都必须取值为字符串数据类型或空单元值。

示例
数值
如果 Measures.CurrentMember 是空单元值,则下例返回 -99,否则返回 Measures.CurrentMember:

CoalesceEmpty(Measures.CurrentMember, -99)
字符串
下例在 Time.Parent.Name 是空单元值时,返回字符串 "EMPTY",否则返回 Time.Parent.Name:

CoalesceEmpty(Time.Parent.Name, "EMPTY")
4.7.4Count
返回集合中项目的数量(具体数目取决于集合)。

语法
维度
Dimensions.Count

返回多维数据集中的维度数,其中包括 [Measures] 维度。

级别
«Dimension»|«Hierarchy».Levels.Count

返回维度或层次结构中的级别数,包括 [All] 级别(如果适用)。

集合 - 语法 1
Count(«Set»[, ExcludeEmpty | IncludeEmpty])

返回集合中的单元数。该语法允许分别使用 ExcludeEmpty 或 IncludeEmpty 标志来排除或包含空单元。

集合 - 语法 2
«Set».Count

返回集合中的单元数,其中包括空单元。

注释
若要从集合计数中排除空单元,请使用可选的 ExcludeEmpty 关键字。

示例
如果 Time 包含级别 Year 和 Month,Year 的成员是 1994 和 1995,那么下面的示例返回 24:

集合 - 示例 1
Count({Time.Month.Members})
集合 - 示例 2
Time.Month.Members.Count
4.7.5IIf
返回由逻辑测试确定的两个数值或字符串值之一。

语法
数字
IIf(«Logical Expression», «Numeric Expression1», «Numeric Expression2»)

如果 «Logical Expression» 取值为 TRUE,则此函数返回 «Numeric Expression1»,否则,返回 «Numeric Expression2»。

字符串
IIf(«Logical Expression», «String Expression1», «String Expression2»)

如果 «Logical Expression» 取值为 TRUE,则此函数返回 «String Expression1»,否则,返回 «String Expression2»。

注释
只有当 «Logical Expression» 的值为零时,才认为该表达式是 FALSE。任何其它值都被解释为 TRUE。

不推荐用 Iif 函数基于搜索条件创建成员的集合。请改用 Filter 函数根据逻辑表达式评估指定集合中的每个成员,然后返回成员的子集合。

示例
数字
如果 Measures.CurrentMember 是空单元,则下面的示例返回 0,否则返回 1:

IIf(IsEmpty(Measures.CurrentMember), 0, 1)
字符串
如果 Measures.CurrentMember 是空单元,则下面的字符串返回字符串 "Yes",否则返回字符串 "No":

IIf(IsEmpty(Measures.CurrentMember), "Yes", "No")
4.7.6Max
返回在某一集合上对数值表达式求得的最大值。

语法
Max(«Set»[, «Numeric Expression»])

注释
Max 函数返回数值表达式的最大值,该表达式在 «Numeric Expression» 中指定,对在 «Set» 中指定的集合进行求值。

示例
如果国家/地区的 Sales 分别是 1000、2000 和 3000,则返回 3000:

Max({USA, CANADA, MEXICO}, Sales)
4.7.7Median
返回在某一集合上对数值表达式求得的中值。

语法
Median(«Set»[, «Numeric Expression»])

注释
Median 函数返回数值表达式的中值,该表达式在 «Numeric Expression» 中指定,对在 «Set» 中指定的集合进行求值。

示例
如果国家/地区的 Sales 分别是 1000、2000 和 3000,则下例返回 2000:

Median({USA, CANADA, MEXICO}, Sales)
4.7.8Min
返回在某一集合上对数值表达式求得的最小值。

语法
Min(«Set»[, «Numeric Expression»])

注释
Min 函数返回数值表达式的最小值,该表达式在 «Numeric Expression» 中指定,对在 «Set» 中指定的集合进行求值。

示例
如果国家/地区的 Sales 分别是 1000、2000 和 3000,则返回 1000:

Min({USA, CANADA, MEXICO}, Sales)
4.7.9Sum
返回在某一集合上对数值表达式求得的和。

语法
Sum(«Set»[, «Numeric Expression»])

示例
如果 USA、CANADA 和 MEXICO 成员的值分别为 1000、2000 和 3000,则以下示例返回 6000:

Sum({USA, CANADA, MEXICO}, Sales.VALUE)
以下示例更加直观,并且同样有效:

Sum({USA, CANADA, MEXICO}, Sales)
4.7.10 Value
返回度量值的值。

语法
«Member».Value

注释
Value 函数返回在 «Member» 中指定的度量值的值。它是度量值的默认属性。

示例
Sales.Measures.CurrentMember.Value
4.7.11 +
    顾名思义,数字相加.

4.7.12 -
    顾名思义,数字相减.

4.7.13 *
    顾名思义,数字相乘.

4.7.14 /
    顾名思义,数字相除.

4.8 字符串函数
4.8.1 Generate
参考集合函数中Generate的描述.

4.8.2 IIf
返回由逻辑测试确定的两个数值或字符串值之一。

参考数值函数中IIF的描述.

4.8.3 Name
返回级别、维度、成员或层次结构的名称。

语法
维度
«Dimension».Name

级别
«Level».Name

成员
«Member».Name

层次结构
«Hierarchy».Name

注释
Name 函数返回对象名称,但不是唯一名称。

示例
维度
Products.Name
级别
Products.[Product Description].Name
成员
Products.[Product Description].Widgets.Name
层次结构
Time.[Fiscal Year].Name
4.8.4 Caption
    类似于Name

4.8.5 UniqueName
返回指定级别、维度、成员或层次结构的唯一名称。

语法
维度
«Dimension».UniqueName

级别
«Level».UniqueName

成员
«Member».UniqueName

层次结构
«Hierarchy».UniqueName

注释
UniqueName 函数返回对象的唯一名称,而不是其它名称。

示例
维度
Products.UniqueName
级别
Products.[Product Description].UniqueName
成员
Products.[Product Description].Widgets.UniqueName
层次结构
Time.[Fiscal Year].UniqueName
4.8.6 Properties
返回包含成员属性值的字符串。

语法
«Member».Properties(«String Expression»)

注释
Properties 函数返回在 «String Expression» 中指定的成员属性的值。成员属性可以是任何标准的成员属性,如 NAME、ID、KEY 或 CAPTION,它也可以是用户定义的成员属性。

示例
在 Store 维度中,如果 Store Name 级别有一个相关的成员属性 Store Manager,则下例返回 Smith:

[Store].[All Stores].[USA].[WA].[Bellingham].[Store 2].Properties("Store Manager")
4.8.9 Format
   将数字格式化成字符串.
    语法
Format(<Numeric Expression>, <Format String Expression>)

注释
<Format String Expression>与度量值的FormatString类似,采用采用java.util.DecimalFormater格式串.

示例
    Format(measures.[Max sales],"#,##0.00"),将度量值[Max Sales]转换成格式为”#,##0.00”的字符串.
Format(200,"#,##0.00")将返回”200.00”.
4.8.10 ||

       将两个字符串相连接.

    语法
<String Expression> || <String Expression>

5.分析功能应用举例
       这些例子相对来说比较复杂,使用了计算成员,主要演示了常用的分析功能.

5.1    成员百分比分析
函数:CurrentMember、Parent等;
分析各城市的销售所占全部城市的总销售额百分比。
 

WITH MEMBER Measures.[Unit Sales Percent] AS '((Store.CURRENTMEMBER, Measures.[Unit Sales]) / (Store.CURRENTMEMBER.PARENT, Measures.[Unit Sales])) ', FORMAT_STRING = '0.00%'
 

SELECT

{Measures.[Unit Sales], Measures.[Unit Sales Percent]} ON COLUMNS,
 

ORDER(DESCENDANTS(Store.[USA].[CA], Store.[Store City], SELF),[Measures].[Unit Sales], ASC) ON ROWS
 

FROM Sales

 

 

 

 

 

 

 

 

5.2 重要顾客分布分析
函数:Count、Sum、Filter、Descendants等;
分析各个省份中重要顾客的数量及他们的总购买量,"重要顾客"的定义是一个顾客的购买金额或者购买数目达到或超过一定的数值。


WITH

MEMBER [Measures].[Qualified Count] AS               

‘COUNT(FILTER(DESCENDANTS(Customers.CURRENTMEMBER, [Customers].[Name]), ([Measures].[Store Sales]) > 10000 OR ([Measures].[Unit Sales]) > 10))' 

MEMBER [Measures].[Qualified Sales] AS 'SUM(FILTER(DESCENDANTS(Customers.CURRENTMEMBER, [Customers].[Name]), ([Measures].[Store Sales]) > 10000 OR ([Measures].[Unit Sales]) > 10), ([Measures].[Store Sales]))'

SELECT

{[Measures].[Qualified Count], [Measures].[Qualified Sales]} ON COLUMNS,

DESCENDANTS([Customers].[All Customers], [State Province], SELF_AND_BEFORE) ON ROWS

FROM Sales

5.3 排序
函数:Order
对各个产品类别按照Store Sales指标降序排列,排序分为维内排序/整体排序。
select {[Measures].[Unit Sales], [Measures].[Store Sales]} on columns,

Order([Product].[Product Department].members, [Measures].[Store Sales], DESC) on rows
 from Sales
 

5.4 历史相关的累计值
函数:YTD、Sum、Descendants
求销售额的本年累计值YTD(),类似还可以求解历史累计YTD()、本月累计MTD()、本周累计WTD()等, 以及更通用的函数PeriodToDate()。
with

member [Measures].[Accumulated Sales] as 'Sum(YTD(),[Measures].[Store Sales])'

select    {[Measures].[Store Sales],[Measures].[Accumulated Sales]} on columns,

{Descendants([Time].[1997],[Time].[Month])} on rows

from [Warehouse and Sales]
 

5.5 四则运算

函数:四则运算函数;
在成员上及指标上均可以进行四则运算,动态派生出新的成员及指标。
 WITH MEMBER MEASURES.ProfitPercent AS '([Measures].[Store Sales]-[Measures].[Store Cost])/([Measures].[Store Cost])',FORMAT_STRING = '#.00%'
 MEMBER [Time].[First Half 97] AS  '[Time].[1997].[Q1] + [Time].[1997].[Q2]'
 MEMBER [Time].[Second Half 97] AS '[Time].[1997].[Q3] + [Time].[1997].[Q4]'
 SELECT {[Time].[First Half 97], [Time].[Second Half 97], [Time].[1997].CHILDREN} ON COLUMNS,
 {[Store].[Store Country].[USA].CHILDREN} ON ROWS
 FROM [Sales]
 WHERE (MEASURES.ProfitPercent)
 

5.6 逻辑判断
函数:IIf
逻辑判断可以根据不同的条件产生不同的结果。下例判断各商店是否是啤酒及白酒的大卖家。
 WITH MEMBER [Product].[BigSeller] AS 'IIf([Product].[Drink].[Alcoholic Beverages].[Beer and Wine] > 100, "Yes","No")'
 SELECT {[Product].[BigSeller],[Product].children} ON COLUMNS,
 {[Store].[All Stores].[USA].[CA].children} ON ROWS
 FROM Sales
 

5.7 成员属性
函数:Properties、
成员属性是与成员绑定的,其对应关系导致很难选择合适的使用方式。以下是使用成员属性的例子,它对应每个商店成员列出了商店类型属性,相应的,商店经理、商店规模、商店地址等属性也可以被列出。该用法稍加灵活应用就可以解决过去遇到的企业名称——〉企业代码对应展示问题。
 
WITH MEMBER [Measures].[StoreType] AS '[Store].CurrentMember.Properties("Store Type")',
MEMBER [Measures].[ProfitPct] AS '(Measures.[Store Sales] - Measures.[Store Cost]) / Measures.[Store Sales]', FORMAT_STRING = '##.00%'
 SELECT { Descendants([Store].[USA], [Store].[Store Name])} ON COLUMNS,
 {[Measures].[Store Sales], [Measures].[Store Cost], [Measures].[StoreType], [Measures].[ProfitPct] } ON ROWS"
 FROM Sales
 

5.8 多步计算实现复杂逻辑
函数:其实可以是任意函数合乎逻辑的组合
求出从来没有买过乳制品的顾客,求解过程是先求出每位顾客在过去购买的乳制品的数量累计,然后找出累计值为0的顾客。同样,过去遇到的求税额大于平均税额的海关的问题可以类似求出。
 
with member [Measures].[Dairy ever] as 'sum([Time].members, ([Measures].[Unit Sales],[Product].[Food].[Dairy]))'
 set [Customers who never bought dairy] as 'filter([Customers].members, [Measures].[Dairy ever] = 0)'
 select {[Measures].[Unit Sales], [Measures].[Dairy ever]}  on columns,
 [Customers who never bought dairy] on rows
 from Sales
 

5.9 同期、前期
函数:PrevMember、ParellelPeriod
求解各产品销售额的去年同期值,年增长率。
with member [Measures].[Store Sales Last Period] as '([Measures].[Store Sales], Time.PrevMember)', format_string='#,###.00'
 member [Measures].[Yearly Increase Rate] as ‘([Measures].[Store Sales] - [Measures].[Store Sales Last Period])/ [Measures].[Store Sales Last Period]', FORMAT_STRING = '0.00%'
 select {[Measures].[Store Sales], [Measures].[Store Sales Last Period]} on columns,
 { [Product].members} on rows
 from Sales
 where ([Time].[1998])
 
另一个例子,使用ParellelPeriod函数。
 WITH MEMBER [Measures].[YTD Unit Sales] AS 'COALESCEEMPTY(SUM(YTD(), [Measures].[Unit Sales]), 0)' MEMBER [Measures].[Previous YTD Unit Sales] AS  '(Measures.[YTD Unit Sales], PARALLELPERIOD([Time].[Year]))'
 MEMBER [Measures].[YTD Growth] AS '[Measures].[YTD Unit Sales] - ([Measures].[Previous YTD Unit Sales])'
 SELECT {[Time].[1998]} ON COLUMNS,
 {[Measures].[YTD Unit Sales], [Measures].[Previous YTD Unit Sales], [Measures].[YTD Growth]} ON ROWS
 FROM Sales;
 

5.10 Top N分析
函数:TopCount
求解1998年总购买量处于前5名的顾客;
select {[Measures].[Store Sales]} on columns,
{TopCount([Customers].[Customer Name].members,5, [Measures].[Store Sales])} on rows
from Sales
where ([time].[1998])
 

5.11成员过滤
函数:Filter、Except
求解1998年所有顾客中购买总额得到1万元以上的顾客,列出满足条件的顾客的名字、年购买数量、年购买金额。
Select {[measures].[Store Sales],[measures].[unit sales]} on columns,
FILTER(Customers.[Name].Members,[Measures].[Store Sales] > 10000) on rows
From sales
Whare ([time].[1998])
另外一种成员过滤(从所有的媒体类型中剔除No Media类型),确切的说应该是集合运算。
select {[Measures].[Unit Sales]} on columns,
except([Promotion Media].[Media Type].members,{[Promotion Media].[Media Type].[No Media]}) on rows
from Sales

 

5.12 时间段
函数:sum、":"运算符
求美国的商店在指定时间段内的销售额。
WITH  MEMBER [Time].[1997].[Six Month] AS 'SUM([Time].[1]:[Time].[6])'
MEMBER [Time].[1997].[Nine Month] AS 'SUM([Time].[1]:[Time].[9])'
SELECT {[Time].[1997].[Six Month],[Time].[1997].[Nine Month]} ON COLUMNS,
{[measures].[store salse]} ON ROWS
FROM Sales
Where ([Store].[USA])

posted @ 2011-10-30 21:54  honkcal  阅读(10335)  评论(0编辑  收藏