Подбор с MDX - PullRequest
       45

Подбор с MDX

2 голосов
/ 19 марта 2010

Привет стека переполнения сообщества.

Я недавно начал строить куб OLAP в SSAS2008 и застрял. Я был бы признателен, если бы кто-то мог, по крайней мере, указать мне правильное направление.

Ситуация : две таблицы фактов, один и тот же куб. FactCalls хранит информацию о звонках, совершенных абонентами, FactTopups хранит данные пополнения счета. Обе таблицы имеют многочисленные общие измерения, одним из которых является измерение подписчика.

FactCalls FactTopups
SubscriberKey SubscriberKey
CallDuration DateKey
CallCost Topup Value ...

Я пытаюсь создать отчеты FactCalls, основанные на отдельных подписчиках, которые пополнили свои счета в течение последних 7 дней.

Что я в основном ищу в MDX, эквивалентном SQL:

select *  
  from FactCalls  
 where SubscriberKey in 
       ( select distinct SubscriberKey from FactTopups where ... );  

Я попытался создать вырожденное измерение для обеих таблиц, содержащих SubscriberKey, и выполнил:

Exist( 
         [Calls Degenerate].[Subscriber Key].Children, 
         [Topups Degenerate].[Subscriber Key].Children 
     )

Без успеха.

С уважением,

Винс

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Вы, вероятно, найдете что-то вроде следующего, которое будет работать лучше. Подход фильтра будет вынужден проходить через каждого подписчика, в то время как функция NonEmpty () может использовать преимущества оптимизации в механизме хранения.

select non empty{ 
        [Measures].[Count], 
        [Measures].[Cost], 
        [Measures].[Topup Value] 

      } on columns, 
      { 
NonEmtpy( [Subscriber].[Subscriber Key].Children,     
            ( [Measures].[Topups Count],     
              [Topup Date].[Calendar].[Month Name].&[2010]&[3] ) )
   } on rows 
 from [Calls] ; 
1 голос
/ 19 марта 2010

Вы знаете, как иногда это самые простые и очевидные решения, которые как-то ускользают от вас? Ну, это, видимо, один из них. Они говорят: «MDX - это не SQL», и теперь я знаю, что они имеют в виду. Я работал над этим с точки зрения исключительно SQL, полностью игнорируя очевидное использование команды filter.

with set [OnlyThoseWithTopupsInMarch2010] as
    filter( 
            [Subscriber].[Subscriber Key].Children, 
            ( [Measures].[Topups Count], 
              [Topup Date].[Calendar].[Month Name].&[2010]&[3] ) > 0 
          )

select non empty{
        [Measures].[Count],
        [Measures].[Cost],
        [Measures].[Topup Value]

      } on columns,
      non empty{ [Test] } on rows
 from [Calls] ; 

Смущающе просто.

...