首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 数据库开发 >

[原]MDX集合操作,该怎么处理

2012-02-07 
[原]MDX集合操作无论是数据库还是数据仓库,集合( SET )操作都是一个最基本,也是最重要的操作之一.熟练各种

[原]MDX集合操作
无论是数据库还是数据仓库,集合( SET )操作都是一个最基本,也是最重要的操作之一.熟练各种集合的基本运算,是MDX的基本要求之一.

MDX中,集合包括5种基本运算.
1.UNION 或 + 并集
2.INTERSECT 交集
3.EXCEPT 或 - 差集
4.CROSSJOIN 或 * 乘集
5.EXTRACT 或 / 除集

这5个集合运算可能从现在的 SET 中构造出新的SET .下面尽量引用MSDN并附加一些个人说明来描述这几个函数的用法.

一.UNION 并集

执行一个集运算,返回两个集的并集,并删除重复成员。

语法 
Set_Expression + Set_Expression

参数 
Set_Expression 
返回集的有效多维表达式 (MDX)。

返回值 
一个包含两个指定集的成员的集。

注释 
+(Union) 运算符的功能与 Union (MDX) 函数相同。

示例 

SELECT 
  [Date].[Calendar].[Calendar Year].Members ON 0,
  {[Sales Territory].[Sales Territory].[Country].[United States]} +
  {[Sales Territory].[Sales Territory].[Country].[Canada]} ON 1
FROM
  [Adventure Works]
WHERE
  ([Measures].[Gross Profit Margin])

说明:
1.只有维度性相同的两个集合才可以产生并集.如同为商品维或同为时间维,不能够一个集合是商品维,而另一个集合是时间维.
2.并集产生的新集合已作去重处理,即 SET1 和 SET2 中有相同的元组,则合并后相同的元组只出现一次.

二.INTERSECT 交集

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

语法 
Intersect(Set_Expression1 , Set_Expression2 [ , ALL ] ) 

参数 
Set_Expression1 
返回集的有效多维表达式 (MDX)。

Set_Expression2 
返回集的有效多维表达式 (MDX)。

注释 
Intersect 函数返回两个集的交集。 默认情况下,此函数会先删除两个集合中的重复项,然后再对这两个集合求交集。
可以使用可选的 ALL 标志来保留重复项。 如果指定了 ALL,Intersect 函数除了照常对非重复的元素求交集以外,还会对第一个集与

第二个集中的重复项求交集。

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

说明:
1.运算的集合必须有相同的维度性.
2.如果不指定ALL参数(默认),则返回去重结果,如果指定ALL参数,则保留重复结果.


三.EXCEPT 或 - 差集

执行一个集运算,返回两个集之间的不同项,并删除重复成员。

语法 
Set_Expression - Set_Expression 

参数 
Set_Expression 
返回集的有效多维表达式 (MDX)。

返回值 
由两个指定集的非共享成员组成的集。

注释 
- (Except) 运算符的功能与 Except 函数相同。

示例 
以下示例演示此运算符的用法:
SELECT 
  [Measures].[Order Quantity] ON COLUMNS,
  [Product].[Product Categories].[All].Children 
  - [Product].[Product Categories].[Components] ON ROWS
FROM
  [Adventure Works]


四.CROSSJOIN 或 * 乘集

执行一个集运算,返回两个集的叉积。

语法 
Set_Expression * Set_Expression 

参数 
Set_Expression 
返回集的有效多维表达式 (MDX)。

返回值 
一个包含两个指定参数的叉积的集。

注释 
* (Crossjoin) 运算符的功能与 Crossjoin 函数相同。

示例 
下面的示例演示了此运算符的用法。
SELECT 
  [Date].[Calendar].[Calendar Year].Members *
  [Reseller].[Reseller Type].Children ON 0,
  [Product].[Category].[Category].Members ON 1
FROM
  [Adventure Works]
WHERE
  ([Measures].[Gross Profit Margin])

说明:
1.这是MDX中最常见的集合运算,产生的结果类似于的笛尔卡积,即产生两个或多个集合中所有的组合.

五.EXTRACT 或 / 除集

返回由提取的层次结构元素中的元组构成的集。

语法 
Extract(Set_Expression, Hierarchy_Expression1 [,Hierarchy_Expression2, ...n] ) 

参数 
Set_Expression 
返回集的有效多维表达式 (MDX)。

Hierarchy_Expression1 
返回层次结构的有效多维表达式 (MDX)。

Hierarchy_Expression2 
返回层次结构的有效多维表达式 (MDX)。

注释 
Extract 函数返回由提取的层次结构元素中的元组构成的集。对于指定集中的每个元组,将指定层次结构的成员提取到结果集中的新元

组。此函数始终删除重复元组。

Extract 函数执行的操作与 Crossjoin 函数相反。

示例
以下查询说明如何在由 NonEmpty 函数返回的元组集上使用 Extract 函数:

SELECT [Measures].[Internet Sales Amount] ON 0, 
EXTRACT( 
  NONEMPTY( 
  [Customer].[Customer].[Customer].MEMBERS 
  * 
  [Date].[Date].[Date].MEMBERS 
  * 
  {[Product].[Product Categories].[Subcategory].&[26],[Product].[Product Categories].



[Subcategory].&[27]} 
  * 
  {[Measures].[Internet Sales Amount]} 
) ,[Customer].[Customer], [Date].[Date]) 
ON 1 
FROM [Adventure Works] 

说明:
这个函数光看帮助可能有点难理解.下面举一个简单的列子来说明:

SET1 = {A,B}
SET2 = {1,2}
SET3 = SET1 * SET2 = { (A,1),(A,2),(B,1),(B,2) }

那么 
SET3/SET1=SET2 
SET3/SET2=SET1


应用举例:

1.如何得到在2007年有销售额而2006年没有销售额的客户.

--这个问题相当于SQL 中的NOT IN .而在MDX中,这实质是一个差集问题.
--先建立2007年有销售额的客户集,然后建立2006年有销售额的客户集.然后将得到的 2007年集-2006年集.就是所求客户.

WITH 
--创建2007有销售额的客户集
SET [basesalary] AS 'Filter([Account].[Account].Members, Not IsEmpty([Line Item].[Line Item].&[1]))'
--创建2006有销售额的客户集;
SET [bonus] AS 'Filter([Account].[Account].Members, Not IsEmpty([Line Item].[Line Item].&[2]))'
--基于上述两个客户集,创建2007有而2006没有销售额的客户集。
SET [basesalary-bonus] AS 'EXCEPT([basesalary],[bonus])'

SELECT [basesalary-bonus] ON 0
FROM [DrillProto]
WHERE ([Measures].[Aggregate]

2.如何得到在2007年有销售额而2006年也有销售额的客户.
-- 这个问题其实与上一个一样,只是将运算符换成了 INTERSECT(交集).

WITH 
--创建2007有销售额的客户集
SET [basesalary] AS 'Filter([Account].[Account].Members, Not IsEmpty([Line Item].[Line Item].&[1]))'
--创建2006有销售额的客户集;
SET [bonus] AS 'Filter([Account].[Account].Members, Not IsEmpty([Line Item].[Line Item].&[2]))'
--基于上述两个客户集,创建2007有而2006也有销售额的客户集。
SET [basesalary-bonus] AS 'INTERSECT([basesalary],[bonus])'

SELECT [basesalary-bonus] ON 0
FROM [DrillProto]
WHERE ([Measures].[Aggregate]


[解决办法]
好,顶上去
[解决办法]
文章不错! 

[解决办法]
文章不错! 文章不错! 文章不错! 文章不错!
[解决办法]
还行!
[解决办法]
2222222222222222222
[解决办法]
不错。
[解决办法]

[解决办法]
不错不错
[解决办法]
通俗易懂。
[解决办法]
围观中~~
[解决办法]
LZ 辛苦了啊 555顶
[解决办法]
asfLZ辛苦了啊
[解决办法]
asdfafa
[解决办法]
haha 不错哈!
[解决办法]
不错哈!
[解决办法]
写得相当不错
[解决办法]
收藏
[解决办法]
学习 收藏 》》》
[解决办法]
顶一个!
[解决办法]

------解决方案--------------------


o
[解决办法]
see see
[解决办法]
好贴留名。
[解决办法]
顶,顶
[解决办法]
通俗易懂
[解决办法]
顶一下
[解决办法]
好,顶一下!
[解决办法]
好东东,收藏了.
[解决办法]

[解决办法]
顶一下

[解决办法]
我顶!
[解决办法]
很不错,收藏
[解决办法]
帮顶吧!
[解决办法]
MDX 好东东哈。
[解决办法]
收藏

热点排行