帮助理解OLAP MDX查询

Zac*_*ack 1 olap ssas 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] )))))
Run Code Online (Sandbox Code Playgroud)

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

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

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

谢谢,

詹姆士

Nyl*_*ile 5

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

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

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

我对整个OLAP课程也相对较新.我一直使用的两个来源是:icCube MDX参考(我不是微软的粉丝,icCube是一个很好的,易于使用的替代品)和Fast Track to MDX.我特别喜欢Fast Track to MDX,因为它对基本MDX功能和术语(如set,tuple,function等)的解释很容易理解,特别是如果你使用的是Microsoft BI工具.你可能也想看一下这篇文章.