MDX Step by Step 读书笔记(五) - Working with Expressions (MDX 表达式)

浏览: 2646

1. 大多数表达式会返回数值类型的值,但是也能返回例如字符串,时间,布尔或者其它类型的值。

2. 一般表达式的结果都是几个值通过操作符运算后得到的,下列表格中显示了对比,逻辑的,数值的,字符串以及集合操作符。

3. SSAS 中的 VBA 函数

 

4. Calculated Members 计算成员

可以把计算成员当成已存在的属性或者层次结构的一个成员,但是计算成员又和其它的传统成员不同,它并不会把值保存在 Cube空间里。

复制代码

WITH
MEMBER [Product].[Category].[All Products].[X] AS
1+1
SELECT
{
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON COLUMNS,
{
([Product].[Category].[Accessories]) ,
([Product].[Category].[Bikes]),
([Product].[Category].[Clothing]),
([Product].[Category].[Components]),
([Product].[Category].[X])
} ON ROWS
FROM [Step-by-Step];

复制代码

这是一个计算成员的示例,在Cube 中的任何成员都必须依附于某一个层次结构,可以是纬度层次结构也可以是度量值层次结构。

这个例子中,计算成员 X 被定义为 Product 纬度 Category 属性层次结构中的一个成员,表达式 1+1 赋予给这个计算成员,结果为2。

但是要注意,如果使用 Members 函数,那么某个纬度下的计算成员将不会出现:

复制代码

WITH
MEMBER [Product].[Category].[All Products].[X] AS
1+1
SELECT
{
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON COLUMNS,
{[Product].[Category].[Category].Members} ON ROWS
FROM [Step-by-Step]

复制代码

这时就要使用 ALLMembers 函数来同时显示成员和计算成员。

复制代码

WITH
MEMBER [Product].[Category].[All Products].[X] AS
1+1
SELECT
{
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON COLUMNS,
{[Product].[Category].[Category].AllMembers} ON ROWS
FROM [Step-by-Step]

复制代码

另外,现在看到的计算成员的使用范围还是属于当前查询范围的,只能在当前查询语句中使用。

动态表达式

示例一

在 Product 纬度下层次结构中添加一个新的计算成员,这个计算成员由一个元组和一个常量相加形成一个表达式。

复制代码

WITH
MEMBER [Product].[Category].[All Products].[X] AS
([Product].[Category].[Bikes])+1
SELECT
{
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON COLUMNS,
{[Product].[Category].AllMembers} ON ROWS
FROM [Step-by-Step];

复制代码

X 的值是 Bikes 在 2003 和 2004年的值+1。

示例二

还是在 Product 纬度下的层次结构中添加一个新的成员Bikes & Accessories, 在它的表达式中由两个 Category 的成员相加组成,即两个元组参与了相加的运算。这个两个元组一个是引用了 Bikes 这个成员,另一个是引用了 Accessories 这个成员。

复制代码

WITH
MEMBER [Product].[Category].[All Products].[Bikes & Accessories] AS
([Product].[Category].[Bikes]) + ([Product].[Category].[Accessories])
SELECT
{
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON COLUMNS,
{[Product].[Category].AllMembers} ON ROWS
FROM [Step-by-Step]

复制代码

查询的结果可以看到 Bikes & Accessories 在2003年和2004年的值等于 Bikes 和 Accessories在2003年和2004年相加的结果。

下面分析一下 SSAS 是如何解析这个计算成员的,并且是如何动态赋值的。

由于我们已经定义了这个计算成员成为 Category 属性层次结构中的一个成员,那么在使用{[Product].[Category].AllMembers 时就能够访问到这个计算成员。我们考虑一下比如 [Date].[Calendar Year].[CY 2003] 成员 和 [Product].[Category].[All Products].[Bikes & Accessories] 这个成员形成的一个交叉点,实际上就是一个单元格或者也可以理解为一个局部元组 –

([Date].[Calendar Year].[CY 2003], [Product].[Category].[All Products].[Bikes & Accessories])  SSAS 会按照3个填充局部元组的规则对这个元组进行填充。(需要了解填充局部元组规则的请参看第三章学习笔记)

 

填充这个局部元组的过程参照上图,最终会得到一个完整的元组 (假设当前环境下只有这几个纬度和层次结构的情况下)。

复制代码

(
[Date].[Calendar Year].[CY 2003],
[Date].[Fiscal Year].[All Periods],
[Product].[Category].[Bikes & Accessories],
[Product].[Subcategory].[All Products],
[Measures].[Reseller Sales Amount]
)

复制代码

但是这个完整的元组包含了一个计算成员 [Product].[Category].[Bikes & Accessories] 因此在实际的Cube 空间里是找不到和它对应的一个点或者一个实际存储有值的那个单元格。那么这时 SSAS 就需要应用表达式获取它的值。

由于这个表达式包含了两个局部元组

([Product].[Category].[Bikes]) 和 ([Product].[Category].[Accessories]),为了补充这两个局部元组,SSAS 不再像之前一样按照规则进行补充,而是从当前的那个已经完成的元组中直接去引用其它成员来实现一个完整的元组。换一个角度来说,当前这个完整的元组为计算成员中出现的元组提供了上下文环境,供其直接引用当前环境的其它成员。

有一点非常重要就是,这两个局部元组只会引用自己所没有的层次结构的其它成员,因此在填充它们自己的元组时因为 [Product].[Category].[Bikes & Accessories]和他们同属一个层次结构,他们已经同在一个轴上,因此将不会再去引用。

对于局部元组 ([Product].[Category].[Bikes]) 而言,对它进行填充的后得到一个完整的元组可以在空间上具体定位到一个点。

复制代码

(
[Date].[Calendar Year].[CY 2003],
[Date].[Fiscal Year].[All Periods],
[Product].[Category].[Bikes],
[Product].[Subcategory].[All Products],
[Measures].[Reseller Sales Amount]
)

复制代码

对于局部元组 ([Product].[Category].[ Accessories]) 而言,对它进行填充的后得到一个完整的元组可以在空间上具体定位到一个点。

复制代码

(
[Date].[Calendar Year].[CY 2003],
[Date].[Fiscal Year].[All Periods],
[Product].[Category].[ Accessories] ,
[Product].[Subcategory].[All Products],
[Measures].[Reseller Sales Amount]
)

复制代码

这样两个完整的元组所表示的值通过操作符 + 相加,就能得到一个结果,这个结果就是计算成员的结果。

因此像这样把 CY 2003 改称 CY 2002

复制代码

(
[Date].[Calendar Year].[CY 2002],
[Date].[Fiscal Year].[All Periods],
[Product].[Category].[Bikes & Accessories],
[Product].[Subcategory].[All Products],
[Measures].[Reseller Sales Amount]
)

复制代码

那么 SSAS 在解析它时实际上也就变成了这两个值相加的结果

复制代码

(
[Date].[Calendar Year].[CY 2002],
[Date].[Fiscal Year].[All Periods],
[Product].[Category].[Bikes],
[Product].[Subcategory].[All Products],
[Measures].[Reseller Sales Amount]
)
+
(
[Date].[Calendar Year].[CY 2003],
[Date].[Fiscal Year].[All Periods],
[Product].[Category].[ Accessories],
[Product].[Subcategory].[All Products],
[Measures].[Reseller Sales Amount]
)

复制代码

以上就是我对动态表达式解析的原理分析。

推荐 2
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

3 个评论

请教个问题
怎么样能将两个度量值进行汇总?
with
member [Dim Product].[Model Name].[ALL].[汇总] as
(sum([Dim Product].[Model Name].[ALL],[Measures].[Sales Amount]))



SELECT NON EMPTY {
[Measures].[Sales Amount] ,[Measures].[Tax Amt - Fact Reseller Sales]} ON COLUMNS
,
{
[Dim Product].[Model Name].children +[Dim Product].[Model Name].[ALL].[汇总]
}on rows FROM [Adventure Works DW] CELL PROPERTIES VALUE

这样只能讲Sales Amount的值汇总,Tax Amt - Fact Reseller Sales的汇总值只是Sale Amount的汇总值,怎么样也将Tax Amt - Fact Reseller Sales的汇总值显示在汇总行中。
说得太好了,计算成员的补全元组的原理我看明白了
为什么显示不了图片呢

要回复文章请先登录注册