MDX 中的交叉点
Posted
技术标签:
【中文标题】MDX 中的交叉点【英文标题】:Intersection in MDX 【发布时间】: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 中对子多维数据集进行了类似的尝试,但没有成功。
【问题讨论】:
【参考方案1】:我已经尝试过了 - 你可以从这里下载我的解决方案:
http://sdrv.ms/YWtMod
我已将您的 Fact 表的副本添加为“交叉引用”,将 Product1 维度别名为“交叉引用”,将维度引用设置为独立于现有关系的 Product,并指定多对-许多关系。
它在 Excel 中返回正确答案(附样本)。
您可以根据需要多次扩展该模式。
祝你好运! 迈克
【讨论】:
有效!极好的。给我一两天时间来完全理解你实际做了什么:-D 有一个小问题:我设法扩展了解决方案,使其使用 3 个产品维度(其中 2 个交叉引用,就像您所做的那样),这非常有效。现在,当用户(我们确实有这种用户)在交叉引用的维度 product2 和 product3 中选择了一个产品,但保留了主要产品维度 product1 不变,那么结果是错误的。在这种情况下,我们可以使用多维数据集计算来强制输出 null,但是有没有办法让它正确计算?如有必要,我可以为此案例提供解决方案 + excel 文件。 在维度使用选项卡上,规则关系应该只存在于一个交叉引用事实和维度对中,即交叉引用事实的同一列或行中不应有多个规则关系& 尺寸。 这不是我的意思。如果用户忽略了第一个产品维度,但使用了其他产品维度,那么结果是错误的。其他一切都有效。有关 excel 文件,请参阅this Screenshot,有关维度使用选项卡,请参阅 this Screenshot。您可以在此处下载 excel 文件和解决方案:zeitz.net/thts/intersection2.zip。非常感谢您的帮助! 您似乎更改了度量 - 以前它是 OrderID 的 Distinct Count,现在您有 Order-Product 组合的计数?我会恢复 OrderID 的 Distinct Count。【参考方案2】:在 SQL 中处理这个问题的另一种方法(我知道它有效,但我没有测试这个查询)是使用双重否定
select distinct orderid
from X
where TK NOT in (
select TK
from X x_alias
where productid NOT in (id1,id2)
)
我很确定您可以在 MDX 中做同样的事情。
【讨论】:
问题是要求 MDX 查询,而不是 SQL 亲爱的。以上是关于MDX 中的交叉点的主要内容,如果未能解决你的问题,请参考以下文章