2016-06-15 3 views
0

Я хотел бы сделать что-то вроде этого (TSQL):SSAS MDX расчет фильтра

select saldi 
where rek in (4,8) 
and rek5 <> 41111 
and rek3 not in (a,b,c) 

После MDX, фильтр (4,8) <> 41111, не работает. Если я удалю фильтр 41111, мера будет работать нормально, просто появится 4/8. Добавление 41111 в качестве фильтра «<>» и результат пуст, а не 0,00.

THIS = IIF(
    ([Rekeningen].[Rek n1].CurrentMember = [Rekeningen].[Rek n1].&[4] 
     or [Rekeningen].[Rek n1].CurrentMember = [Rekeningen].[Rek n1].&[8]) 
    and [Rekeningen].[Rek n5].CurrentMember <> [Rekeningen].[Rek n5].&[41111] 
, 
    [Measures].[Saldi], 0.00 
); 

Я пробовал Google, но, похоже, не получил правильное ключевое слово. На social.msdn.microsoft.com много реакций отмечены как ответ, но не для меня так далеко. Развертывание ssas-куба работает отлично, никаких ошибок.

Может ли кто-нибудь указать мне в правильном направлении? Я пробовал Except, но эта команда, похоже, не работает с многоуровневыми полями (rek3/rek5).

ответ

0

IS и NOT IS используются при сравнении участников. Это дает нам следующее:

THIS = 
    IIF 
    (
     (
     [Rekeningen].[Rek n1].CurrentMember IS [Rekeningen].[Rek n1].&[4] 
     OR 
     [Rekeningen].[Rek n1].CurrentMember is [Rekeningen].[Rek n1].&[8] 
    ) 
    AND 
     [Rekeningen].[Rek n5].CurrentMember IS NOT [Rekeningen].[Rek n5].&[41111] 
    ,[Measures].[Saldi] 
    ,0 
); 

Вместо 0 вы должны почти всегда использовать null в куб сценария Calcs или убьешь производительность:

THIS = 
    IIF 
    (
     (
     [Rekeningen].[Rek n1].CurrentMember IS [Rekeningen].[Rek n1].&[4] 
     OR 
     [Rekeningen].[Rek n1].CurrentMember is [Rekeningen].[Rek n1].&[8] 
    ) 
    AND 
     [Rekeningen].[Rek n5].CurrentMember IS NOT [Rekeningen].[Rek n5].&[41111] 
    ,[Measures].[Saldi] 
    ,NULL 
); 

Я не уверен насчет этих имен членов? [Rekeningen].[Rek n1].CurrentMember и [Rekeningen].[Rek n1].&[4]. Позвольте мне добавить два альтернативных варианта, которые я думаю, они могли бы быть:

1.

THIS = 
    IIF 
    (
     (
     [Rekeningen].[Rek n1].CurrentMember IS [Rekeningen].[Rek n1].[Rek n1].&[4] 
     OR 
     [Rekeningen].[Rek n1].CurrentMember is [Rekeningen].[Rek n1].[Rek n1].&[8] 
    ) 
    AND 
     [Rekeningen].[Rek n5].CurrentMember IS NOT [Rekeningen].[Rek n5].[Rek n5].&[41111] 
    ,[Measures].[Saldi] 
    ,NULL 
); 

или

2.

THIS = 
    IIF 
    (
     (
     [Rekeningen].CurrentMember IS [Rekeningen].[Rek n1].&[4] 
     OR 
     [Rekeningen].CurrentMember is [Rekeningen].[Rek n1].&[8] 
    ) 
    AND 
     [Rekeningen].CurrentMember IS NOT [Rekeningen].[Rek n5].&[41111] 
    ,[Measures].[Saldi] 
    ,NULL 
); 
+0

Спасибо за подробный ответ. @whytheq Получил ошибки разбора, если это не «НЕ»? Отметьте это как ответ, потому что разрешил проблему, однако она не выполняла функционально то, что я хотел в кубе. Я переосмыслить и перефразировать мой вопрос и опубликовать новый. –

+0

@FabioBruna извиняется за ошибки синтаксического анализа - я отредактировал ответ. Да, я довольно часто получаю mdx, который работает нормально, но не возвращает число, которое я ожидаю: обычно я потом разбивал скрипт на гораздо меньшие куски и тестировал их, чтобы увидеть, какие данные они возвращают ... затем увеличивайте сложность больше .. пока «ведет себя», как ожидалось. – whytheq

Смежные вопросы