Ssas MDX用于统计普通成员-存在替代方案

Ssas MDX用于统计普通成员-存在替代方案,ssas,mdx,exists,Ssas,Mdx,Exists,让我以[AdventureWorks]cube为例来描述这个问题 以下MDX返回的计数为17473 SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS, [Internet Sales Order Details].[Sales Order Number] on ROWS FROM [Adventure Works]) WHERE ( [Sales Reason].[Sales Reason].&[1]

让我以[AdventureWorks]cube为例来描述这个问题

以下MDX返回的计数为17473

SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS,

[Internet Sales Order Details].[Sales Order Number] on ROWS

FROM [Adventure Works])

WHERE ( [Sales Reason].[Sales Reason].&[1] -- price
然后返回3515次

SELECT NON EMPTY { [Measures].[Internet Order Count] } ON COLUMNS ,

[Internet Sales Order Details].[Sales Order Number] on ROWS

FROM [Adventure Works]

WHERE ( [Sales Reason].[Sales Reason].&[2]) -- on promotion
我想计算[Sales Reason]、[Sales Reason]、[2]中常见的[Sales Order Number]

SQL等价物是:

select count(distinct f.SalesOrderNumber)
from FactInternetSales f
join FactInternetSalesReason fs 
on f.SalesOrderNumber = fs.SalesOrderNumber and f.SalesOrderLineNumber = fs.SalesOrderLineNumber
where fs.SalesReasonKey = 1 and fs.SalesOrderNumber in
      (select SalesOrderNumber from FactInternetSalesReason fs1 where fs1.SalesReasonKey = 2)

-- sales reason 1 = 17473
-- sales reason 2 = 3515
-- common 1689
我使用以下mdx获得了公共计数:

WITH MEMBER [Measures].[common] AS count

   (  exists ( exists ([Internet Sales Order Details].[Sales Order Number].[Sales Order Number].Members,
         [Sales Reason].[Sales Reason].&[1],"Internet Orders" 
         ),
         [Sales Reason].[Sales Reason].&[2],"Internet Orders" 
        )
    )

SELECT NON EMPTY [Measures].[common] ON COLUMNS

FROM [Adventure Works] 

-- 1689
但是对于我的要求,EXISTS的使用相当缓慢。请提出一个替代方案

也请参阅相关的线程


谢谢

请尝试将这两个原因作为一组添加到WHERE子句中:

SELECT 
  NON EMPTY 
    {[Measures].[Internet Order Count]} ON COLUMNS
 ,[Internet Sales Order Details].[Sales Order Number] ON ROWS
FROM [Adventure Works]
WHERE 
  {
    [Sales Reason].[Sales Reason].&[2]
   ,[Sales Reason].[Sales Reason].&[1]
  };
下面是一个运行速度更快的替代方案,它只查看常见订单,不使用EXISTS函数:

WITH 
  SET [AllOrders] AS 
    [Internet Sales Order Details].[Sales Order Number].[Sales Order Number].MEMBERS 
  SET [OrdersIntersection] AS 
    Intersect
    (
      NonEmpty
      (
        [AllOrders]
       ,{
          (
            [Sales Reason].[Sales Reason].&[1]
           ,[Measures].[Internet Order Count]
          )
        }
      )
     ,NonEmpty
      (
        [AllOrders]
       ,{
          (
            [Sales Reason].[Sales Reason].&[2]
           ,[Measures].[Internet Order Count]
          )
        }
      )
    ) 
  MEMBER [Measures].[commonCount] AS 
    [OrdersIntersection].Count 
SELECT 
  //NON EMPTY //<<not needed
    [Measures].[commonCount] ON COLUMNS
FROM [Adventure Works];

我需要的是“网上订单数量”,这在“销售原因”1和2中很常见,而不是它们的总数。@PrakashGautam-我误解了你的问题。我已经为我的帖子添加了一个替代方案。您的exists脚本在我的机器上以1.1秒的速度运行,而我的intersection版本则以0.8秒的速度运行。谢谢@whytheq,Intersect确实比exists运行得更快。