MDX中的交叉点

时间:2013-03-06 14:31:11

标签: sql-server-2008 ssas mdx olap

我最近在SQL Server 2008 Analysis Services Cube中遇到了问题。想象一下,您有一个包含订单和产品的简单销售数据仓库。每个订单都可以与多个产品相关联,每个产品可以包含在多个订单中。因此,数据仓库至少包含3个表:一个用于产品,一个用于订单,一个用于参考表,用于建模两者之间的n:n关系。 我希望我们的多维数据集回答的问题是:有多少订单包含产品x和产品y? 在SQL中,这很简单:

select orderid from dbo.OrderRefProduct
where ProductID = 1
intersect
select orderid from dbo.OrderRefProduct
where ProductID = 3

由于我非常精通SQL,但是MDX中的新手,我无法在MDX中实现它。我尝试过使用不同的计数度量,MDX函数intersectnonempty以及子多维数据集。我还尝试在逻辑上复制维度(通过将维度添加到多维数据集两次)以及物理复制(通过复制数据源表和维度)。

http://www.zeitz.net/thts/intersection.zip上,您可以下载一个25kB大小的zip文件,其中包含带有一些测试数据的SQL脚本和使用这些表的Analysis Services解决方案。

我们正在使用SQL Server 2008 R2及其Analysis Services对应项。性能考虑因素并不重要,因为与该多维数据集中包含的其他度量值组(数十亿行)相比,数据量相当低(数百万行)。

最终目标是能够在标准OLAP中使用所需的功能(自定义计算的测量是可以的),因为Excel是我们的主要前端,我们的客户希望从维度列表中选择他们的产品并获得多维数据集度量的正确结果。但即使是一个有效的独立MDX-Query也会有很大的帮助。

谢谢!

编辑3月12日 我错过了什么或不能以某种方式解决这个问题吗?

如果它有助于构建mdx,这是另一种使用subquerys在sql中获取结果的方法。它可以进一步嵌套。

select distinct b.orderid from
(
select distinct orderid from dbo.OrderRefProduct
where ProductID = 1
) a
join dbo.OrderRefProduct b on (a.orderid = b.orderid)
where ProductID = 3

我在mdx中尝试使用子多维数据集这样的东西,但没有成功。

2 个答案:

答案 0 :(得分:3)

我已经去了 - 你可以从这里下载我的解决方案:

http://sdrv.ms/YWtMod

我已将Fact表的副本添加为“交叉引用”,将Product1维度别名为“交叉引用”,将Dimension引用设置为独立于现有关系,并指定Many-to-很多关系。

它在Excel中返回正确答案(附带样本)。

您可以根据需要多次扩展该模式。

祝你好运! 麦克

答案 1 :(得分:0)

在SQL中处理这个问题的另一种方法(我知道它有效,但我没有测试这个查询)是使用双重否定

select distinct orderid 
from X 
where TK NOT in (
   select TK 
   from X x_alias 
   where productid NOT in (id1,id2)
)

我很确定你可以在MDX中做同样的事情。