我最近在 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 中尝试了类似的子多维数据集,但没有成功。
最佳答案
我已经尝试过 - 您可以从这里下载我的解决方案:
我已添加事实表的副本作为“交叉引用”,将 Product1 维度别名为“交叉引用”,独立于现有关系将维度引用设置为 Product,并指定多对多许多关系。
它在 Excel 中返回正确的答案(附有示例)。
您可以根据需要多次扩展该模式。
祝你好运! 迈克
关于sql-server-2008 - MDX 中的交集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15250014/