SSAS MDX для отношения "многие ко многим"

Используя куб Adventureworks DW 2008, я пытаюсь создать запрос MDX, который будет возвращать количество интернет-заказов, не имеющих определенного кода причины для заказа.

FactInternetSales имеет отношение «многие ко многим» с FactInternetSalesReason. Каждая продажа имеет 1 или более кодов причин.

Если я попытаюсь вернуть заказы, в которых не использовалась причина «По акции», я все равно буду учитывать заказы по акции, потому что у них есть и другие причины.

Как мне написать MDX, чтобы сказать, что если у этого заказа есть эта причина, не включать ее в подсчет, независимо от каких-либо других причин?

Эквивалентным SQL для хранилища данных Adventure Works sql будет:

select count(distinct salesordernumber) from FactInternetSales
where not exists (select salesorderNumber 
                    from FactInternetSalesReason 
                    where SalesReasonKey = 2 
                    and FactInternetSales.SalesOrderNumber = FactInternetSalesReason.SalesOrderNumber
                )

person Mike    schedule 29.10.2014    source источник


Ответы (1)


Это счетчик интернет-заказов:

SELECT 
  {
    [Measures].[Internet Order Count]
  } ON 0
FROM [Adventure Works];

Это количество интернет-заказов без учета акции:

SELECT 
  {
    [Measures].[Internet Order Count]
  } ON 0
FROM [Adventure Works]
WHERE 
  Except
  (
    [Sales Reason].[Sales Reason].[Sales Reason]
   ,[Sales Reason].[Sales Reason].[On Promotion]
  );

Следующее превращает эти исключения в конкретные меры:

WITH 
  MEMBER [Measures].[Internet Order Count OnPromotion] AS 
    (
      [Measures].[Internet Order Count]
     ,[Sales Reason].[Sales Reason].[On Promotion]
    ) 
  MEMBER [Measures].[Internet Order Count excl OnPromotion] AS 
      [Measures].[Internet Order Count]
    - 
      [Measures].[Internet Order Count OnPromotion] 
SELECT 
  {[Date].[Calendar].[(All)]} ON 0
 ,{
    [Measures].[Internet Order Count]
   ,[Measures].[Internet Order Count OnPromotion]
   ,[Measures].[Internet Order Count excl OnPromotion]
  } ON 1
FROM [Adventure Works];
person whytheq    schedule 29.10.2014
comment
Спасибо. Это работает в кубе Adventure Works, но не работает в моем кубе. Что-то должно быть сломано на моем кубе. Вернуться к доске для рисования. :) - person Mike; 31.10.2014
comment
Когда я посмотрел на числа поближе, ваш второй запрос возвращает 21 197 из куба AW для заказов с исключенными акциями, но ваш третий запрос, используя вычисляемый показатель, возвращает заказы с исключенными акциями как 24 144. Так что теперь я пытаюсь выяснить, что вызывает несоответствие - person Mike; 31.10.2014