关于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. <2013 12 17> 专业技能

    Specialties: • Mechanical design modeling using Pro/ENGINEER and SolidWorks.• Robot control, path pl ...

  2. JavaScript事件onblur与onfocus区别

    一.onblur 1.1 说明 onblur属性在元素失去焦点时触发,onblur常用于表单验证代码(例如用户离开表单字段). 1.2 示例 <input type="text&quo ...

  3. js模块化方法的写法

    详细:一点点白 http://www.cnblogs.com/LoveOrHate/p/4454852.html 原始写法: function m1(){} function m2(){} 对象写法: ...

  4. 控制台程序的中文输出乱码问题(export LC_CTYPE=zh_CN.GBK,或者修改/etc/sysconfig/i18n为zh_CN.GBK。使用setlocale(LC_CTYPE, "");会使用默认办法。编译器会将源码做转换成Unicode格式,或者指定gcc的输入文件的编码参数-finput-charset=GBK。Linux下应该用wprintf(L"%ls/n",wstr))

    今天发现用securecrt登陆时,gcc编译出错时会出现乱码,但直接在主机的窗口界面下用Shell编译却没有乱码.查看了一下当时的错误描述,发现它的引号是中文引号,导致在SecureCRT中显示出错 ...

  5. 回顾: Python面向对象三大特性

    继承 待整理^_^ 封装 待整理^_^ 多态 待整理^_^

  6. B-Tree vs LSM-tree

    什么是B-树 一.已排序文件的查找时间 对一个有N笔记录的已排序表进行二叉查找,可以在O(log2N)比较级完成.如果表有1,000,000笔记录,那么定位其中一笔记录,将在20 ( log21,00 ...

  7. ubuntu 安装Nodejs

    ubuntu 安装Nodejs 1.在软件管理器里面安装nodejs2.由于版本很老,所以需要更新版本:先安装npm , sudo apt install npm然后用npm安装 n 命令,更新nod ...

  8. 【JDBC】java程序通过jdbc连接oracle数据库方法

    版权声明:本文为博主原创文章(原文:blog.csdn.net/clark_xu 徐长亮的专栏).未经博主同意不得转载. https://blog.csdn.net/u011538954/articl ...

  9. PS批量修改照片大小

    最近发现一个好玩的东西,分享一下懒人的做法 1.先打开一张图片,调出动作面板 2.新建动作,开始记录. 3.按Ctrl + Alt + I 或者选择图像菜单----图像大小,调出修改图像大小对话框. ...

  10. A+B和C (15)

    时间限制 1000 ms 内存限制 32768 KB 代码长度限制 100 KB 判断程序 Standard (来自 小小) 题目描述 给定区间[-2的31次方, 2的31次方]内的3个整数A.B和C ...