您的位置:首页 > 数据库

《Microsoft SQL Server 2008 MDX Step by Step》学习笔记五:生成复杂的集合(Sets)(上)

2011-08-17 17:01 656 查看
SQL Server 2008中SQL应用系列及BI笔记系列--目录索引

导读:本文介绍集合(Sets)的进阶内容,本文将包括以下内容:
■1、组装一个有序集合
■2、应用标准来控制集合成员关系(Apply criteria to control set membership )
■3、应用集合逻辑和高级的集合生成技术。


本文所用数据库和所有源码,请到微软官网下载

1、组装有序集合
打开MDX查询编辑器,如下:
例6-1
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
{[Product].[Product].[Product].Members} ON ROWS
FROM [Step-by-Step]
;
查询结果:



我们修改排序,如下:
例6-2
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Order(
{[Product].[Product].[Product].Members},
([Measures].[Reseller Sales Amount]),
DESC
) ON ROWS
FROM [Step-by-Step]
;



注意排序字段,这里使用了Order函数(http://msdn.microsoft.com/zh-cn/library/ms145587.aspx)。
例6-3
SELECT
{
([Measures].[Reseller Sales Amount]),
([Measures].[Internet Sales Amount])
} ON COLUMNS,
Order(
{[Product].[Product].[Product].Members},
VBAMDX!ABS(
([Measures].[Reseller Sales Amount]) -
([Measures].[Internet Sales Amount])
),
DESC
) ON ROWS
FROM [Step-by-Step]
;
注意,我们使用了上一节提到的VBA函数,结果以两列之差的绝对值为排序依据。



注意:使用Order还可以突破分层限制。
例6-4
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
{[Product].[Subcategory].[Subcategory].Members} ON ROWS
FROM [Step-by-Step]
;



例6-5
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
{[Product].[Category].[Category].Members} *
{[Product].[Subcategory].[Subcategory].Members} ON ROWS
FROM [Step-by-Step]
;



再进一步,看一个双排序的例子
例6-6
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Order(
{[Product].[Category].[Category].Members} *
{[Product].[Subcategory].[Subcategory].Members}
,
([Measures].[Reseller Sales Amount]),
DESC
) ON ROWS
FROM [Step-by-Step]
;




在上面的查询中,交叉联接使用默认排序,而且后面指定了([Measures].[Reseller Sales Amount])排序,但是大家注意到没有,这一列并没有按照指定的数值排序,为什么呢?因为默认的ASC和DESC是分层的(hierarchical),换句话说,这些元组的前一个成员的排序被保留了。为了打乱这个层次结构,可以使用BASC和BDESC(http://msdn.microsoft.com/zh-cn/library/ms145587(v=SQL.105))。

例6-7
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Order(
{[Product].[Category].[Category].Members} *
{[Product].[Subcategory].[Subcategory].Members},
([Measures].[Reseller Sales Amount]),
BDESC
) ON ROWS
FROM [Step-by-Step]
;



OK!这下消停了。^_^
顺便,我们提一下Hierarchize函数(http://msdn.microsoft.com/zh-cn/library/ms145981.aspx),该函数可以按层次结构的顺序组织指定集中的成员,返回集的有效多维表达式 (MDX)。。
我们看一个例子
例6-8
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Hierarchize(
{
([Product].[Product Categories].[Subcategory].[Road Bikes]),
([Product].[Product Categories].[All Products]),
([Product].[Product Categories].[Subcategory].[Mountain Bikes]),
([Product].[Product Categories].[Category].[Bikes]),
([Product].[Product Categories].[Subcategory].[Touring Bikes])
}
) ON ROWS
FROM [Step-by-Step]
;



如果定义POST标志,则 Hierarchize 函数按非自然顺序对一定级别的成员进行排序。 也就是说,子成员优先于他们的父级。
例6-9
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Hierarchize(
{
([Product].[Product Categories].[Subcategory].[Road Bikes]),
([Product].[Product Categories].[All Products]),
([Product].[Product Categories].[Subcategory].[Mountain Bikes]),
([Product].[Product Categories].[Category].[Bikes]),
([Product].[Product Categories].[Subcategory].[Touring Bikes])
},
POST
) ON ROWS
FROM [Step-by-Step]
;



注意到排序规则了么?如果没有观察出来,请留言或联系我,3w@live.cn,呵呵。
范围操作符:包含一个默认的排序
例6-10
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
{[Date].[Calendar].[CY 2001]:[Date].[Calendar].[CY 2004]} ON ROWS
FROM [Step-by-Step]
;
/*
Reseller Sales Amount
CY 2001 $8,065,435.31
CY 2002 $24,144,429.65
CY 2003 $32,202,669.43
CY 2004 $16,038,062.60
*/

2、检索一个集合的最后一个或第一个元组
我们用到两个函数TopCount(http://msdn.microsoft.com/zh-cn/library/ms144792.aspx)和BottomCount(http://msdn.microsoft.com/zh-cn/library/ms144864.aspx
注意:这两个函数总是会打乱层次结构。
例6-11
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
TopCount(
{[Product].[Subcategory].[Subcategory].Members},
5,
([Measures].[Reseller Sales Amount])
) ON ROWS
FROM [Step-by-Step]
;

/*
Reseller Sales Amount
Road Bikes $29,358,206.96
Mountain Bikes $26,492,684.38
Touring Bikes $10,451,490.22
Mountain Frames $4,713,672.15
Road Frames $3,849,853.34
*/
注意,未指定顺序时,默认按升序排列。
Head函数(http://msdn.microsoft.com/zh-cn/library/ms144859(v=SQL.105)),返回集中位置靠前的指定数目的元素,同时保留重复项。Head 函数从指定集的开始处返回指定的元组数目。并保留元素的顺序。Count 的默认值为 1。如果指定的元组数目小于 1,则 Head 函数返回空集。如果指定的元组数目超过了集中的元组数目,则此函数返回原始集。
Tail函数(http://msdn.microsoft.com/zh-cn/library/ms146056.aspx),Tail 函数从指定集的结尾处返回指定的元组数目。 会保留元素的顺序。 Count 的默认值为 1。如果指定的元组数目小于 1,则该函数返回空集。 如果指定的元组数目超过了集中的元组数目,则此函数返回原始集。

例6-12
SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Tail(
Order(
{[Product].[Subcategory].[Subcategory].Members},
([Measures].[Reseller Sales Amount]),
BDESC
),
5
) ON ROWS
FROM [Step-by-Step]
;
/*
Reseller Sales Amount
Tires and Tubes $925.21
Bike Stands (null)
Fenders (null)
Lights (null)
Panniers (null)
*/
Item函数(http://msdn.microsoft.com/zh-cn/library/ms145501.aspx),下面,我们看一个比较复杂的例子
例6-13
WITH
MEMBER [Measures].[Top Product Sales] AS
{
EXISTING
TopCount(
[Product].[Product].[Product].Members,
1,
([Measures].[Internet Sales Amount])
) *
{[Measures].[Internet Sales Amount]}
}.Item(0)
,FORMAT_STRING="Currency"
MEMBER [Measures].[Top Product Name] AS
{
EXISTING
TopCount(
[Product].[Product].[Product].Members,
1,
([Measures].[Internet Sales Amount])
)
}.Item(0).Item(0).Name
SELECT
{
([Measures].[Internet Sales Amount]),
([Measures].[Top Product Sales]),
([Measures].[Top Product Name])
} ON COLUMNS,
{
([Date].[Calendar Year].[CY 2001]),
([Date].[Calendar Year].[CY 2002]),
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON ROWS
FROM [Step-by-Step]
;



上例中综合运用了本节和上节的几个常用函数,大家可以自行分析。
小结:本文是集合(Sets)的进阶,介绍了几个常用的排序函数,下文继续介绍过滤集合和组合集合,以及一些高级的技巧。

参考资源:
1、MDX官方教程(http://msdn.microsoft.com/zh-cn/library/ms145506.aspx

邀月注:本文版权由邀月和CSDN共同所有,转载请注明出处。
助人等于自助!
3w@live.cn
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐