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

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

转载于:https://www.cnblogs.com/downmoon/archive/2011/08/17/2143311.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MDX 中的重要概念 使用成员、元组和集 (MDX) MDX 语法元素 标识符 表达式 使用多维数据集表达式和子多维数据集表达式 使用维度表达式 使用成员表达式 使用元组表达式 使用集表达式 使用标量表达式 使用空值 运算符(MDX 语法) 算术运算符 位运算符 比较运算符 串联运算符 集运算符 一元运算符 赋值运算符 函数(MDX 语法) 使用字符串函数 使用数学函数 使用逻辑函数 使用成员函数 使用元组函数 使用集函数 使用维度函数、层次结构函数和级别函数 使用存储过程 (MDX) 注释(MDX 语法) 保留关键字(MDX 语法) MDX 查询基础知识 基本 MDX 查询 EXISTING 关键字 用查询轴和切片器轴限定查询 指定查询轴的内容 指定切片器轴的内容 在简单示例中使用查询轴和切片器轴 在查询中建立多维数据集上下文 在 MDX生成子多维数据集 在 MDX生成命名集 创建查询作用域的命名集 创建会话作用域的命名集 在 MDX生成计算成员 在 MDX生成单元计算 创建和使用属性值 操作数据 修改数据 使用变量和参数 MDX 脚本编写基础知识 基本 MDX 脚本 管理作用域和上下文 错误处理 支持的 MDX MDX 语言参考 MDX 语法约定 MDX 语句参考 MDX 脚本编写语句 MDX 数据定义语句 MDX 数据操作语句 MDX 运算符参考 --(注释) -(排除) -(负) -(减) *(叉积) *(乘) /(除) ^(幂) /*...*/(注释) //(注释) :(范围) +(加) +(正) +(字符串串联) +(联合) <(小于) <=(小于或等于) (不等于) =(等于) >(大于) >=(大于或等于) AND IS NOT OR XOR MDX 函数参考 AddCalculatedMembers Aggregate AllMembers Ancestor Ancestors Ascendants Avg Axis BottomCount BottomPercent BottomSum CalculationCurrentPass CalculationPassValue Children ClosingPeriod CoalesceEmpty Correlation Count(维度) Count(层次结构级别) Count(集) Count(元组) Cousin Covariance CovarianceN Crossjoin Current CurrentMember CurrentOrdinal CustomData DataMember DefaultMember Descendants Dimension Dimensions Distinct DistinctCount DrilldownLevel DrilldownLevelBottom DrilldownLevelTop DrilldownMember DrilldownMemberBottom DrilldownMemberTop DrillupLevel DrillupMember Error Except Exists Extract Filter FirstChild FirstSibling Generate Head Hierarchize Hierarchy IIf Intersect IsAncestor IsEmpty IsGeneration IsLeaf IsSibling Item(成员) Item(元组) KPIGoal KPIStatus KPITrend KPIWeight KPICurrentTimeMember KPIValue Lag LastChild LastPeriods LastSibling Lead Leaves Level Levels LinkMember LinRegIntercept LinRegPoint LinRegR2 LinRegSlope LinRegVariance LookupCube Max MeasureGroupMeasures Median Members(集) Members(字符串) MemberToStr MemberValue Min Mtd Name NameToSet NextMember NonEmpty NonEmptyCrossjoin OpeningPeriod Order Ordinal ParallelPeriod Parent PeriodsToDate Predict PrevMember Properties Qtd Rank RollupChildren Root SetToArray SetToStr Sib
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值