【发布时间】:2013-03-06 14:31:10
【问题描述】:
我最近在我们的 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 函数 intersect 和 nonempty 和子立方体。我还尝试在逻辑上(通过将维度添加到多维数据集两次)和物理上(通过复制数据源表和维度)复制维度。
在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,这是另一种在 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 中对子多维数据集进行了类似的尝试,但没有成功。
【问题讨论】:
标签: sql-server-2008 ssas mdx olap