假设我们只想显示一些与数据没有任何关联的维度成员信息,并且希望它们能够以行集的形式来显示,那么在 MDX 中就应该直接显示 ROWS AXIS (1) 并且忽略掉 COLUMNS AXIS(0)。比如说有100个成员信息,如果是一列100行的形式通常符合大家的查询习惯,如果是一行100列,读起来就比较困难。
需要了解的是 SELECT 语句最多可以支持 128 个轴,轴的序号从 0 ~ 127,但是基本上我们不会使用的到那么多, 一般只使用前两个, 即我们常用的 COLUMNS 和 ROWS, 因为大多数客户端工具只能支持到二维即显示行和列。并且是使用这些轴的名称的时候, 他们的顺序必须是连续的。即如果写了 ROWS, 那么COLUMNS 也必须存在 , 不能只使用 ROWS 而不使用COLUMNS。
那么就只要这样做就可以了,在 COLUMNS 即 0 轴中放置一个空的 SET 集合 { },然后在 ROWS 轴*问所需要的成员。
SELECT
{ } ON 0,
{ [Customer].[Customer].[Customer].MEMBERS } ON 1
FROM [Adventure Works]
如果只需要查询所有包含 "John" 这个字的成员,比如说以后可以做成根据关键字查询 -
SELECT
{ } ON 0,
{
Filter(
[Customer].[Customer].[Customer].MEMBERS,
InStr([Customer].[Customer].CurrentMember.Name, 'John') > 0
)
} ON 1
FROM [Adventure Works]
如果为了显示 ROWS 轴而在 COLUMNS 轴上加上其它的度量值这样会降低查询效率,因为在 ROWS 中的每一个成员都会到 Cube 空间中去匹配对象的度量值。想这样在 COLUMNS 轴没有度量值的参入,那么 ROWS 轴上的维度成员就直接可以从维度空间里获取,效率更高一些。
如果有一些第三方的工具或者编译器要求必须在 COLUMNS 位置提供度量值数据的话,那么可以使用常量数据来表示 ,这样仍然会比访问 Cube 中的度量值成员效率要高,只不过这个查询的结果并不真正使用而已。
WITH MEMBER [Measures].[CustomerConstant] AS
1
SELECT
{ [Measures].[CustomerConstant] } ON 0,
{
Filter(
[Customer].[Customer].[Customer].MEMBERS,
InStr([Customer].[Customer].CurrentMember.Name, 'John') > 0
)
} ON 1
FROM [Adventure Works]
参数化的查询 -
SELECT
{ } ON 0,
{
Filter(
[Customer].[Customer].[Customer].MEMBERS,
InStr([Customer].[Customer].CurrentMember.Name, @CustomerName) > 0
)
} ON 1
FROM [Adventure Works]
本文涉及到的其它 MDX 知识点:
- MEMBERS - 从属性层次结构或者属性层次结构某一层中取出所有的成员,返回的是一个成员的集合 {SET}。如果某一个 Hierarchy 层次结构没有指定特别的 Level 时,Members 函数就会返回包含 All 在内的所有成员。关于 MEMBERS 的有关内容可以参照: MDX Step by Step 读书笔记(四) - Working with Sets (使用集合)
- Filter - 对指定集合中的每个元组计算指定一个逻辑表达式,如果表达式计算结果为 True,那么该函数将返回由指定集中每个元组构成的集。如果所有元组的计算结果都不为 True,则返回一个空集。关于 Filter 函数的使用可以参照 : MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Filtering Sets
- InStr - 返回一个字符串在另一个字符串中第一次出现的位置。有关 InStr 的内容可以参照 MSDN InStr 函数
其它 BI 笔记请参照 BI 系列随笔列表 (SSIS, SSRS, SSAS, MDX, SQL Server)