有人提出类似的问题here,但我会简要介绍一下。 在SQL Server中有3个表:
OrderRefProduct是一个多对多表,因为一个产品可以有不同的订单,不同的产品可以在一个订单中。
所有这些都被添加到OLAP多维数据集中,订单和产品作为维度,OrderRefProduct作为事实。我们需要获得类似SQL查询输出的结果:
SELECT ProductId, COUNT(*) as [Count]
FROM OrderRefProduct
GROUP BY ProductId
对应的MDX查询非常简单,因为Cube是正确构建的:
SELECT
NON EMPTY { [Measures].[Order Ref Product Count] } ON COLUMNS,
NON EMPTY { ([Product].[Product ID].[Product ID].ALLMEMBERS ) } ON ROWS
FROM [Sales]
两者的结果是:
ProductId Count
1 7
2 7
3 5
4 6
现在问题就在于此。 我想选择具有BOTH产品3和4的订单数量。 SQL:
select ProductId, Count(*) as [Count]
from OrderRefProduct
where [OrderId] in
(SELECT S.OrderID FROM
(select * from OrderRefProduct where ProductID=3) as S
INNER JOIN (select * from OrderRefProduct where ProductID=4) as T on T.OrderId = S.OrderID)
Group by ProductId
结果:
ProductId Count
1 1
2 1
3 3
4 3
无法在MDX查询中重现此内容。到目前为止我可以实现的是全加入,而我需要一个内部加入。 任何帮助,将不胜感激。 可以找到测试解决方案here。
答案 0 :(得分:0)
换句话说,简单地在where子句中放置多选是OR。你想要一个AND过滤器。试试这个:
WITH
MEMBER [Measures].[HasBothProducts] as
IIf(
([Product].[Product ID].&[3], [Measures].[Order Ref Product Count]) > 0
And ([Product].[Product ID].&[4], [Measures].[Order Ref Product Count]) > 0
,1
,Null
)
SELECT
{ [Measures].[Order Ref Product Count] } ON COLUMNS,
NON EMPTY { ([Product].[Product ID].[Product ID].ALLMEMBERS ) } ON ROWS
FROM [Sales]
WHERE NonEmpty([Order].[Order ID].[Order ID].Members, [Measures].[HasBothProducts])