2015-01-10 3 views
0

[Adventure Works] cube에서 예제를 제공하는 문제를 설명해 드리겠습니다. MDX 다음일반 회원 수를 계산하는 MDX - EXISTS 대안

는 17,473

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 동등한은 다음과 같습니다

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의 내 요구 사항에 대한 다소 느리다 :

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를 사용하여 공통의 수를 얻었다. 대안을 제시하십시오.

또한 스레드 관련 참조하시기 바랍니다 here

감사합니다

답변

0

하나의 집합으로 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]; 
+0

'Sales Reason'1 및 2에서 일반적으로 사용되는 '인터넷 주문 횟수'가 필요합니다. 총 횟수는 아닙니다. –

+0

@PrakashGautam - 질문에 대해 오해했습니다. 내 게시물에 대한 대안을 추가했습니다. 당신의'exists' 스크립트는 제 기계에서 1.1 초에 실행되지만 교차점 버전은 0.8 초에서 실행됩니다. – whytheq

+0

감사합니다. @whytheq, 인터 섹트가 더 빨리 실행되고 존재합니다. –