关于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]

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中,将不能正确的执行

即如下的查询是错误的:

with Member [Measures].[sales]
as
LookupCube("[profit]" "([Measures].[Price], [产品].[Name].currentmember)*([Measures].[Number], [产品].[Name].currentmember)")

select {[Measures].[价钱],[Measures].[数量],[Measures].[sales]} on 0
,
{[产品].[Name].[Name],[产品].[Name]} on 1
from [Sales]

此时假设[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]
 

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

MDX跨cube查询——lookupcube的更多相关文章

  1. 如何使用SQL SERVER数据库跨库查询

    SQL Server中内置了数据库跨库查询功能,下面简要介绍一下SQL Server跨库查询.首先打开数据源码:OPENDATASOURCE不使用链接的服务器名,而提供特殊的连接信息,并将其作为四部分 ...

  2. django(3) 一对多跨表查询、ajax、多对多

    1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b,  通过查询hos ...

  3. SqlServer跨库查询

    由于业务的拆分,数据库拆分为两种作用: 汇总数据库(Master,头节点数据库), 子节点数据库(Compute Node,计算子节点数据库) 这样,就设计到子节点访问头节点数据库中的某张汇总表,这种 ...

  4. ACCESS-如何多数据库查询(跨库查询)

    测试通过:ACCESSselect * from F:\MYk.mdb.tablename说明:1.查询语句2.来原于哪(没有密码是个路径)3.查询的表名 ====================== ...

  5. 跨服务器查询sql语句样例

    若2个数据库在同一台机器上:insert into DataBase_A..Table1(col1,col2,col3----)select col11,col22,col33-- from Data ...

  6. SQLServer 跨服务器查询的两个办法

    网上搜了跨服务器查询的办法,大概就是Linked Server(预存连接方式并保证连接能力)和OpenDataSource(写在语句中,可移植性强).根据使用函数的不同,性能差别显而易见...虽然很简 ...

  7. 不同SQL Server数据库之间的跨数据库查询

    --不同SQL Server数据库之间的跨数据库查询 EXEC sp_addlinkedserver @server=N'OldDatabase', --自己定义别名 @srvproduct=N'', ...

  8. 开启MSSQLServer跨服务器查询功能

    首先在MSSQL客户端中进行如下图文操作配置 其次使用脚本进行操作配置 ---开启SQLServer 跨服务器查询功能 exec sp_configure 'show advanced options ...

  9. (ArcGIS API For Silverlight )QueryTask 跨层查询,和监控完整的查询!

    (ArcGIS API For Silverlight )QueryTask 跨层查询,和监控完整的查询!     直接在源代码:     定义全局变量:    int  index=0; /// & ...

随机推荐

  1. Asp.Net MVC anti-forgery token的问题:nameidentifier or identityprovider not present

    当使用ClaimsIdentity的时候,Asp.Net MVC在生成AntiForgeryToken的时候会默认使用User.Identity中两种ClaimsType的值:NameIdentifi ...

  2. mui 视频播放

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  3. Matlab mser(最大极值稳定区域)

    在Matlab R2013a 和R2014a中已经实现MSER特征的提取. 一.函数detectMSERFeatures 输入的是M*N的灰度图片.可以指定阈值刻度,区域范围,感兴趣区域等参数. 输出 ...

  4. 视频解码芯片SAA7111A的初始化

    为了完成SAA7111A的初始化,FPGA需要完成I2C控制器的设计. 之前本科的时候初步接触过I2C,但是编写一个Verilog的控制器还是觉得有点难度的.说实话,那时候都无从下手,对实现这样一个协 ...

  5. PhoneGap 兼容IOS上移20px(包括启动页,拍照)

    引自:http://stackoverflow.com/questions/19209781/ios-7-status-bar-with-phonegap 情景:在ios7下PhoneGap app会 ...

  6. STM32 ~ CH340在STM32实现一键下载电路

    在做基于STM32的多功能MP3播放器的课题时,在程序下载这部分时借鉴了正点原子开发板上的一键下载电路,采用CH340G这款芯片设计. 在画PCB初期原理图部分,对采用CH340G设计的一键下载电路不 ...

  7. 前端基础之Bootstrap介绍

    bootstrap简介 http://v3.bootcss.com/ Bootstrap优点:  下载:  Bootstrap引入 <meta name="viewport" ...

  8. LeetCode:螺旋矩阵【54】

    LeetCode:螺旋矩阵[54] 题目描述 给定一个包含 m x n 个元素的矩阵(m 行, n 列),请按照顺时针螺旋顺序,返回矩阵中的所有元素. 示例 1: 输入: [ [ 1, 2, 3 ], ...

  9. Spring:笔记整理(1)——HelloWorld

    Spring:笔记整理(1)——HelloWorld 导入JAR包: 核心Jar包 Jar包解释 Spring-core 这个jar 文件包含Spring 框架基本的核心工具类.Spring 其它组件 ...

  10. SpringBoot2.1.0 application.properties配置

    # =================================================================== # COMMON SPRING BOOT PROPERTIE ...