我只是对其作了翻译(其中括号部分是我的观点),并对每个mdx语句出现的mdx常用函数略作解释。(如翻译有误、理解不够的地方,敬请指正!)
href="http://blog.csdn.net/songgl/Services/Pingback.aspx" rel="pingback" /> <script>function hide(){showComment();}</script>
读者请求最多的是更多的
MDX
信息。他们通常要求更多的
MDX
例子,在这里,我提供
15
个典型的
MDX
语句,用的是
SQL Server 2000 Analysis Services' FoodMart 2000 sample cubes
,以下例子都以
Sales
多维数据集为例。
LISTING 1: Determining Products Sold in Each State
说明:
查询在所有州都销售的品牌。
with
set
[SoldInUSA]
as
'
Filter
([Product].[Brand Name]
.Members
,
Not
IsEmpty
( ([USA], [Unit
Sales]) ))'
member
[Measures].[SoldInState]
as
'
iif
(
IsEmpty
(([Product]
.CurrentMember
, [Unit Sales],
[Customers]
.CurrentMember
)),
"No"
,
"Yes"
)'
select
[USA]
.children
on
COLUMNS
,
[SoldInUSA]
on
ROWS
from
Sales
where
([SoldInState])
查询结果展示:
500){this.resized=true;this.style.width=500;}" border="0" />
查询结果展示:
500){this.resized=true;this.style.width=500;}" border="0" />
注
:
Filter
|
返回根据搜索条件对集合进行筛选所得到的集合。
|
例子
|
SELECT
{[Measures].[Store Sales] } ON COLUMNS,
{ filter(time.allmembers,[Measures].[Store Sales]>50000)
}
ON rows from sales
|
iif
|
返回由逻辑测试确定的两个数值或字符串值之一。
|
例子
|
with
member
measures.abc
as
'
iif
(
isempty
(measures.[unit sales]),
"
空了
"
,
"
不空
"
)'
SELECT
{ { { [Time].&[1997] } * { [Measures].[Unit Sales],measures.abc } } }
ON
COLUMNS
, {
DESCENDANTS
( [Store].[All Stores], [Store].[Store Name] ) }
ON
ROWS
FROM
[Sales]
|
1. 在美国所有州都销售的有那些产品品牌?
Listing 1 创建了个自定义集合SoldInUsa,该集合排除了在整个美国Unit Sales为空值的品牌。该查询定义了一个计算成员,描述Current State是否销售Current Product;如果有销售返回Yes,否则返回No。这个查询在columns显示States,在Rows显示Produts,单元值区域依据product-state的聚合交集显示Yes或No.
或许你已经发现,该查询返回的结果同个品牌可能返回多次。Sales Cube是依据brand来给Products分类的(把产品类别分成不同的品牌),所以如果某品牌生产多种产品,该品牌在层次结构中将多次出现。乍一看,这种重复出现确实是个问题,大概你会把多次出现的同个品牌当成不同的品牌。举个例子,一个公司(对应一个品牌)生产luggage和clothes,作为本例分析,最好将其当成不同品牌来理解,这样才不至于因为其不销售luggage就判断该品牌没有销售(实际情况其可能销售clothes)而导致错误。
02.
所有商店中销售前10名的产品类别有哪些?
Listing 2 直接利用TopCount()函数查询销售前10名的产品。
Listing 2 直接利用TopCount()函数查询销售前10名的产品。
(这是一种最直接的方法,TopCount()函数本身自带排序(降序)的功能)
LISTING 2: Determining Top 10 Product Categories
说明:查询销售前10名的产品类别
select
{[Unit Sales]}
on
COLUMNS
,
TopCount
( [Product].[Product Category]
.Members
, 10, ([Unit Sales]) )
on
ROWS
from
Sales
查询结果展示:
03. 在美国,刚刚过去的三个季度里都有销售量的食品和饮料有哪些?
(这个查询也可以理解为“过去三个季度里食品和饮料销售量都不为0的产品有哪些?”)。查询Listing 3 示范了如何动态的确定对应的时间集合—这是一项很有价值的技巧。时间集合动态随着cube数据的更新而改变(也就是说该查询无论你在什么时候执行,无论cube的数据作了多少次更新,结果都是最近三个月的数据)。首先,自定义集合LastQuarter定义了时间维度中有销售记录的最近一个季度。自定义集合Last3Quarters在LastQuarter的基础上利用Range()函数(实际没有range()函数,冒号:就是作者说的函数)指定了以LastQuarter为最后一个季度的连续的三个季度。我不直接在Last3Quarter(原文是LastQuarter,我认为是作者笔误)的定义中使用Tail()函数是因为这样做返回的可能不是连续的三个季度;因为空记录的季度肯能出现在任何季度,Filter()函数只能排除掉空季度。Lag()函数结合range()函数,确保了返回的三个季度是连续的。
查询结果展示:
03. 在美国,刚刚过去的三个季度里都有销售量的食品和饮料有哪些?
(这个查询也可以理解为“过去三个季度里食品和饮料销售量都不为0的产品有哪些?”)。查询Listing 3 示范了如何动态的确定对应的时间集合—这是一项很有价值的技巧。时间集合动态随着cube数据的更新而改变(也就是说该查询无论你在什么时候执行,无论cube的数据作了多少次更新,结果都是最近三个月的数据)。首先,自定义集合LastQuarter定义了时间维度中有销售记录的最近一个季度。自定义集合Last3Quarters在LastQuarter的基础上利用Range()函数(实际没有range()函数,冒号:就是作者说的函数)指定了以LastQuarter为最后一个季度的连续的三个季度。我不直接在Last3Quarter(原文是LastQuarter,我认为是作者笔误)的定义中使用Tail()函数是因为这样做返回的可能不是连续的三个季度;因为空记录的季度肯能出现在任何季度,Filter()函数只能排除掉空季度。Lag()函数结合range()函数,确保了返回的三个季度是连续的。
在这个查询中,item(0).item(0) 函数取得指定集合的第一个成员,因为集合在技术上就是一组元组[如:来自不同维度的一系列成员也可以组成一个元组],所以用第一个Item()函数选择元组,第二个Item()选择该元组里的成员。(我们可以这样理解,集合由元组组成,元组由成员组成)。
Listing_03.Determining Brands Sold During the Past Three Quarters.txt
说明:在过去三个季度里都存在销售量的商品销售记录
with
set
[LastQuarter]
as
'
Tail
(
Filter
([Time].[Quarter]
.Members
,
Not
IsEmpty
([Time]
.CurrentMember
)),1)'
set
[Last3Quarters]
as
' [LastQuarter]
.item
(0)
.item
(0)
.Lag
(2) : [LastQuarter]
.item
(0)
.item
(0)'
select
[Last3Quarters]
on
COLUMNS
,
Non
EmptyUnion
(
Descendants
( [Food], [Product].[Brand Name] ),
Descendants
( [Drink],
[Product].[Brand Name] ))
on
ROWS
from
Sales
查询结果展示:
注:
TopCount
|
从集合顶端开始返回指定数目的项,可以选择首先对集合排序。
|
例子
|
SELECT
{[Measures].[Store Sales] } ON COLUMNS,
Topcount(Descendants([Store].[All Stores].[USA],[Store].[Store City] ), 10, [store sales])
ON rows from sales
|
Subset
|
从集合中返回元素的子集。
|
例子
|
SELECT
{measures.[store sales] }
ON
COLUMNS
,
{
Subset
(Time
.allMembers
,0,6)}
ON
rows
from
sales
|
Tail
|
从集合尾部返回子集。
|
例子
|
SELECT
{measures.[store sales] }
ON
COLUMNS
,
{
tail
(
Subset
(Time
.allMembers
,0,6),4)}
ON
rows
from
sales
|
Lag
|
返回指定成员的所在维度上的上一个成员。
|
例子
|
with member [measures].[a1] as 'time.currentmember.lag(1).name'
SELECT {[measures].[a1] } ON COLUMNS , { [Time].allmembers } ON ROWS FROM [Sales]
|
Filter
|
返回根据搜索条件对集合进行筛选所得到的集合。
|
例子
|
SELECT {[Measures].[Store Sales] } ON COLUMNS,
{ filter(time.allmembers,[Measures].[Store Sales]>50000)
} ON rows from sales
|
Item
|
从集合中返回指定元组或者从元组中返回指定成员。
|
例子
|
with set kkk as '{{[Time].[1997], [Time].[1998]}*{[Store].[All Stores].[Canada],[Store].[All Stores].[USA]} }'
member measures.jjj as 'TupleToStr(kkk.item(0).item(0))',solve_order=1
select { measures.[store sales],measures.jjj } on columns,
{kkk} on rows
from Sales
|
Union
|
返回两个集合的并集,可以选择保留重复项。
|
例子
|
SELECT {[Measures].[Store Sales] } ON COLUMNS,
Union(USA.Children, CANADA.Children, ALL)
ON rows
|
href="http://blog.csdn.net/songgl/Services/Pingback.aspx" rel="pingback" /> <script>function hide(){showComment();}</script>