2

我最近在我们的 SQL Server 2008 Analysis Services Cube 中遇到了一个问题。假设您有一个包含订单和产品的简单销售数据仓库。每个订单可以关联多个产品,每个产品可以包含在多个订单中。因此,数据仓库至少包含 3 个表:一张用于 Products,一张用于 Orders,一张用于参考表,对两者之间的 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,这是另一种在 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 中尝试了类似的子立方体,但没有成功。

4

2 回答 2

3

我试了一下 - 你可以从这里下载我的解决方案:

http://sdrv.ms/YWtMod

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

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

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

祝你好运!麦克风

于 2013-03-12T10:52:46.737 回答
0

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

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

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

于 2013-03-15T07:39:20.540 回答