Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 MDX中的交叉点_Sql Server 2008_Ssas_Mdx_Olap - Fatal编程技术网

Sql server 2008 MDX中的交叉点

Sql server 2008 MDX中的交叉点,sql-server-2008,ssas,mdx,olap,Sql Server 2008,Ssas,Mdx,Olap,我最近在SQL Server 2008 Analysis Services多维数据集中遇到了一个问题。假设您有一个简单的销售数据仓库,其中包含订单和产品。每个订单可以与多个产品关联,并且每个产品可以包含在多个订单中。因此,数据仓库至少由3个表组成:一个用于产品,一个用于订单,一个用于参考表,对两者之间的n:n关系进行建模。 我想让我们的立方体回答的问题是:有多少订单同时包含产品x和产品y? 在SQL中,这很简单: select orderid from dbo.OrderRefProduct w

我最近在SQL Server 2008 Analysis Services多维数据集中遇到了一个问题。假设您有一个简单的销售数据仓库,其中包含订单和产品。每个订单可以与多个产品关联,并且每个产品可以包含在多个订单中。因此,数据仓库至少由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
和子多维数据集。我还尝试在逻辑上(通过向多维数据集添加两次维度)和物理上(通过复制数据源表和维度)复制维度

在上,您可以下载一个大小为25kB的zip文件,其中包含一个SQL脚本,其中包含一些测试数据和使用表的Analysis Services解决方案

我们使用的是SQLServer2008R2及其AnalysisServices对应产品。性能方面的考虑并不是那么重要,因为与多维数据集中包含的其他度量值组(数十亿行)相比,数据量非常低(数百万行)

最终目标是能够在标准OLAP中使用所需的功能(自定义计算的度量值可以),因为Excel是我们的主要前端,我们的客户希望从维度列表中选择产品,并在多维数据集度量值中获得正确的结果。但即使是一个独立的MDX查询也会大有帮助

谢谢大家!

编辑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中返回正确答案(附示例)

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

祝你好运!
Mike

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

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

我敢肯定,在MDX中也可以做到这一点。

这很有效!好极了给我一两天的时间,让我完全了解您的实际操作:-t有一个小问题:我设法扩展了解决方案,使其使用了3个产品维度(其中两个维度相互参照,就像您所做的那样),这非常有效。现在,当一个用户(我们确实有这种类型的用户)选择交叉引用维度product2和product3中的一个产品,但保留主产品维度product1不变时,结果是错误的。在这种情况下,我们可以使用多维数据集计算来强制输出null,但是有没有办法使其正确计算?如果需要,我可以为这种情况提供一个solution+excel文件。在“维度使用”选项卡上,规则关系应该只存在于一个交叉引用事实和维度对中,即,对于交叉引用事实和维度,在同一列或行中不应该有多个规则关系。这不是我的意思。如果用户忽略第一个产品维度,但使用其他产品维度,则结果是错误的。其他一切都起作用。有关excel文件的详细信息,请参见,有关“尺寸使用”选项卡的详细信息,请参见。您可以在此处下载excel文件和解决方案:。非常感谢你的帮助!看起来您已经更改了度量值-以前它是OrderID的一个不同计数,现在您有了订单产品组合的计数?我将恢复OrderID的不同计数。问题是询问MDX查询,而不是SQL查询。