我最近在SQL Server 2008分析服务多维数据集中遇到了一个问题。想象一下,你有一个简单的销售数据仓库,有订单和产品。每个订单可以与几个产品相关联,每个产品可以包含在几个订单中。因此,数据仓库至少由三个表组成:一个用于产品,一个用于订单,一个用于参考表,用于建立两者之间的n:n关系。 我希望我们的立方体回答的问题是:有多少订单同时包含产品x和产品y? 在SQL中,这是很容易:MDX中的交叉点
select orderid from dbo.OrderRefProduct
where ProductID = 1
intersect
select orderid from dbo.OrderRefProduct
where ProductID = 3
因为我在SQL相当精通,但在MDX一个新手,我一直无法实现,在MDX。我已经尝试使用不同的计数度量,MDX函数intersect
和nonempty
以及subcubes。我也尝试在逻辑上复制维度(通过将维度添加到多维数据集两次)以及物理上(通过复制数据源表和维度)。
在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中尝试了类似于subcubes的东西,但没有成功。
它的工作原理!太棒了。给我一两天来完全理解你实际做了什么:-D – 2013-03-12 12:52:51
有一个小问题:我设法扩展解决方案,以便使用3个产品维度(其中2个交叉引用,就像你一样),这个完美的作品。现在,当用户(并且我们确实有这种类型的用户)选择交叉引用维度product2和product3中的产品,但保留主产品 - dimnension product1时,结果是错误的。在这种情况下,我们可以使用多维数据集计算来强制输出null,但有没有办法使它正确计算?如有必要,我可以为这种情况提供解决方案+ excel文件。 – 2013-03-13 10:34:44
在“维用途”选项卡上,常规关系应仅存在于一个交叉引用事实和维度对中,即您不应该在交叉引用事实和维度的同一列或行中具有多个常规关系。 – 2013-03-14 02:17:10