Ssas MDX用于统计普通成员-存在替代方案
让我以[AdventureWorks]cube为例来描述这个问题 以下MDX返回的计数为17473Ssas 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]
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运行得更快。