帮助理解OLAP MDX查询

时间:2011-01-07 11:39:10

标签: ssas olap mdx olap-cube

我一直在努力学习SSAS Cubes和MDX。到目前为止,我已设法创建一个多维数据集,通过多维数据集浏览器查看时返回正确的数据/计算。

查询生成器用于在报告服务中构建查询以查询多维数据集,我查看了生成的MDX并提取了似乎对实际结果没有影响的内容。查询如下所示:

SELECT NON EMPTY { [Measures].[AverageConnectedSeconds] } ON COLUMNS,    
NON EMPTY { ([Operator].[ACCESS DEF].[ACCESS DEF].ALLMEMBERS * [Calls].[Notification Time Bands].[Notification Time Bands].ALLMEMBERS) } ON ROWS    
FROM ( SELECT ( -{ [Calls].[Notification Time Bands].&[0] } ) ON COLUMNS    
FROM ( SELECT ( { [Calls].[Incoming YN].[N] } ) ON COLUMNS    
FROM ( SELECT ( -{ [Calls].[Entity Type].&[6] } ) ON COLUMNS   
FROM ( SELECT ( -{ [Calls].[Reason Text].&[Background Call] } ) ON COLUMNS    
FROM ( SELECT ( { STRTOMEMBER(@OperatorId) } ) ON COLUMNS   
FROM [PNC5data] )))))

我已经阅读了语法,我 THINK 我理解为什么查询正在进行嵌套选择。 我是否正确理解嵌套的SELECT FROM在SQL中是否充当WHERE子句?

如果是这样的话:MDX中使用的WHERE子句是什么?何时/为什么要使用它?

如果有人能够告诉我这个查询中实际发生的情况,我真的很感激!或者,如果你能够指导我一个资源,我可以进一步了解MDX,我会很高兴!

谢谢,

詹姆斯

2 个答案:

答案 0 :(得分:5)

了解WHERE子句很简单。你会在许多消息来源中看到人们抱怨它的误导性名称。更好的名称是切片器。通过使用where子句,您可以查询多维数据集的切片而不是整个多维数据集(显然,当您查询切片而不是整个多维数据集时,您将获得一些性能提升)。

使用FROM子句查询多维数据集查询另一个MDX查询,即子查询。子查询通常较慢,但也更强大。例如当您使用层次结构作为切片器时,如果使用子查询,则不能在轴中使用它,例如子查询可以更改层次结构的结构。

在上面的语句中,您会看到嵌套的子查询。如果你知道一些MDX语法,很容易破解和解释每个子查询,甚至可以将一些子查询移动到切片器。

我对整个OLAP主题也相对较新。我使用的两个来源是:icCube MDX reference(我不是微软的粉丝,icCube是一个很好的,易于使用的替代品)和Fast Track to MDX。我特别喜欢Fast Track to MDX,因为它对基本MDX功能和术语(如set,tuple,function等)的解释很容易理解,特别是如果你使用的是Microsoft BI工具。您也可以查看this post

答案 1 :(得分:0)

我之前发布了一个链接到我的MDX介绍并且很受欢迎,但是在这个帖子中还有很多其他好的资源。 the-best-mdx-references-on-the-net