个很具代表性的 查询语句
读者请求最多的是更多的 MDX 信息。他们通常要求更多的 MDX 例子,在这里,我提供 15 个典型的 MDX 语句,用的
是 SQL Server 2000 Analysis Services' FoodMart 2000 sample cubes,以下例子都以 Sales 多维数据集为例。
在美国所有州都销售的有那些产品品牌?
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)而导致错误。
说明: 查询在所有州都销售的品牌。
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])
注 :
Filter
返回根据搜索条件对集合进行筛选所得到的集合。
例子
SELECT {[Measures].[Store Sales] } ON COLUMNS,
{ <lter(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]
所有商店中销售前 ! 名的产品类别有哪些?
Listing 2 直接利用 TopCount()函数查询销售前 10 名的产品。
(这是一种最直接的方法,TopCount()函数本身自带排序(降序)的功能)
"!#
说明:查询销售前 ! 名的产品类别
select {[Unit Sales]} on COLUMNS,
TopCount( [Product].[Product Category].Members, 10, ([Unit Sales]) ) on ROWS
from Sales
查询结果展示: