关于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. MySql 安装常见问题汇总

    说明: 以下是针对 Mac 10.11 系统 以前,安装 MySql 数据库后, 设置的密码过于复杂,想更改为简单的密码, 方便数据库的使用. 1. 关闭和启动 MySql 数据库的方法: Syste ...

  2. 洛谷 P2721 小Q的赚钱计划

    洛谷 这大概是我见过最水的紫题吧- 洛谷标签赞一个! 题意:你有一年时间,把10w元存银行变成更多钱,在特定时间区间内,你会有一些利息,不过不可中途退出. 直接dp:st[i]表示区间左端点,ed[i ...

  3. Python3.6全栈开发实例[001]

    检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者. li = [11,22,33,44,55,66,77,88,99,000,111,222] def func1(l ...

  4. 1.8 使用电脑测试MC20的GPRS功能

    需要准备的硬件 MC20开发板 1个 https://item.taobao.com/item.htm?id=562661881042 GSM/GPRS天线 1根 https://item.taoba ...

  5. 算法题 18 像素翻转 牛客网 CC150

    算法题 18 像素翻转 牛客网 CC150_P114 题目描述 有一副由NxN矩阵表示的图像,这里每个像素用一个int表示,请编写一个算法,在不占用额外内存空间的情况下(即不使用缓存矩阵),将图像顺时 ...

  6. Django——Session源码分析

    首先我们导入django.contrib.sessions.middleware这个中间件,查看里面的Session源码 from django.contrib.sessions.middleware ...

  7. admin 模块功能

    class CustomModelAdmin(admin.ModelAdmin): def has_module_permission(self, request): 是否会显示model def h ...

  8. Python基础(7)_闭包函数、装饰器

    一.闭包函数 闭包函数:1.函数内部定义函数,成为内部函数, 2.改内部函数包含对外部作用域,而不是对全局作用域名字的引用那么该内部函数成为闭包函数 #最简单的无参闭包函数 def func1() n ...

  9. LeetCode:矩阵置零【73】

    LeetCode:矩阵置零[73] 题目描述 给定一个 m x n 的矩阵,如果一个元素为 0,则将其所在行和列的所有元素都设为 0.请使用原地算法. 示例 1: 输入: [   [1,1,1],   ...

  10. UI控件之UIView与动画

    UIView:用来展示用户的界面,响应用户的操作(继承自UIResponder) UIView的作用:绘图.动画.处理事件 UIView可以包含和管理子视图,并且决定子视图的位置大小 获取所有的子视图 ...