关于SSAS中从多个cube中查询数据
前提:涉及的cube在同一数据库中,维度共享(最好)
SSAS中提供一条mdx语句同时从多个cube中查询数据的功能 实现该功能的就是lookupcube函数,当然前提是这两个cube在同一个数据库中,共享维度(不是共享维度能不能查还没有试验过)
lookupcube函数的语法如下: LookupCube(Cube_Name, Numeric_Expression ) LookupCube(Cube_Name, String_Expression ) 其中Cube_Name是指查询的多维数据集 Numeric_Expression是指数值表达式,即一个字符串
关于该函数MSDN上这样解释道: 如果指定了某个数值表达式,则 LookupCube 函数在指定的多维数据集内计算指定的数值表达式并且返回得到的数值。 如果指定了某个字符串表达式,则 LookupCube 函数在指定的多维数据集内计算指定的字符串表达式并且返回得到的字符串。 LookupCube 函数在源多维数据集(对其执行包含 LookupCube 函数的 MDX 查询)所在的数据库内对多维数据集进行处理。 重要提示: 因为当前查询的上下文不会延续到将要查询的多维数据集,所以必须在数值或字符串表达式内提供任何必要的当前成员。
其中最后一项提示很重要,它说明了在查询时不能将我们查询context相关的一些关键信息交由lookupcube函数来处理,而是要在函数的外面处理好了以后再交由函数查询cell值。
什么意思呢,在这里举一个例子来说明一下:
如果cube中有“产品”维,度量有 “单价”和“销量”,现在我们要查询出产品对应的总销售额。
在同一个cube中,我们可以如下来查询:
with Member [Measures].[sales] as ([Measures].[价钱], [产品].[Name].currentmember)*([Measures].[数量], [产品].[Name].currentmember) select {[Measures].[价钱],[Measures].[数量],[Measures].[sales]} on 0 , {[产品].[Name].[Name],[产品].[Name]} on 1 from [Sales]
当然这里的查询有些地方是多余的,在这里只是为了对比说明一下问题! 在上面的例子中currentmember即是指循环时的执行上下文,所以它如果出现在Numeric_Expression或者String_Expression中,将不能正确的执行
即如下的查询是错误的:
此时假设[Measures].[Price],[Measures].[Number]在多位数据集[profit]中定义,而维度和剩余的度量是在[Sales]中
上述的查询将不会得到正确的结果数据,原因是lookupcube将无法解释执行上下文currentmember
那么正确的查询是什么样呢? 应该在lookupcube执行前将currentmember解释完,然后再执行该函数,如下:
with Member [Measures].[sales] as lookupcube("[profit]", "([Measures].[Price]," + [产品].[Name].currentmember.uniqueName+ ")* ([Measures].[Number]," + [产品].[Name].currentmember.uniqueName+ ")") select {[Measures].[价钱],[Measures].[数量],[Measures].[sales]} on 0 , {[产品].[Name].[Name],[产品].[Name]} on 1 from [Sales]
此时,每一次循环currentmember将由外部解释完后组装成一个字符串传给lookupcube去执行。
上面的查询,如果在[profit]中也存在对应的“[朋友].[Name]”Hierarchy.将会看到正确的结果数据
currentmember执行上下文在这里提供了很好的解决方法来处理,但是对于其它类的就要稍微复杂一些,这里就不一一去介绍了!如:where轴的处理、维度节点遍历……
同时这里还只是简单的需求,至于更复杂的跨cube查询将结合相关的字符串函数来完成,这部分有时间了再总结!
另:lookupcube目前只在msas中发现了该函数,在mondrian、Essbase中都还没有发现(至少本人没有发现),不知道是否有类似的功能函数。
作者:slob
原文:http://www.cnblogs.com/sthinker/p/5998636.html