MDX交叉点 - 如何?

时间:2015-10-15 21:41:36

标签: sql-server ssas mdx olap business-intelligence

有人提出类似的问题here,但我会简要介绍一下。 在SQL Server中有3个表:

  1. 订单(Id,日期);
  2. 产品(Id,Name);
  3. OrderRefProduct(Id,OrderId,ProductId);
  4. 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

1 个答案:

答案 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])