繁体   English   中英

MDX计算普通成员-EXISTS替代

[英]MDX to count common members - EXISTS alternative

让我描述一下[Adventure Works]多维数据集中的问题。

以下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

我想计算[销售原因]。& 1和[销售原因]。&[2]中常见的[销售订单编号]。

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];

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM