2015-12-09 3 views
3

Я новичок в mdx.Как использовать поиск в MDX, который возвращает совпадения от двух ключевых слов

Есть ли способ поиска и возврата совпадений из двух ключевых слов с использованием MDX, как мы используем в MySQL, используя LIKE '% iphone' И LIKE '% samsung'?

Мой MDXcode является:

SELECT 
NON EMPTY {[Measures].[Average Price]} ON COLUMNS, 
Filter({[Product Names].MEMBERS}, 
[Product Name].CurrentMember.Name MATCHES '(?i)apple.*' or [Product Name].CurrentMember.Name MATCHES '(?i)screen.*') ON ROWS 
FROM [Price History] 

Вот в моем коде, любой поиск выполняется, но я хочу, оба условия будут удовлетворены.

Есть ли способ, пожалуйста, помогите?

+0

С вашего вопроса, похоже, вам просто нужно заменить 'или' с 'и' в вашем состоянии 'Filter'. – user4637357

ответ

3

MDX не имеет оператора LIKE, но вы можете использовать функцию InStr, чтобы проверить, являются ли ключевые слова частью имени.

with member measures.iPhoneInName as 
VBA!InStr([Product Name].CurrentMember.Name, "iPhone") 

member measures.SamsungInName as 
VBA!InStr([Product Name].CurrentMember.Name, "Samsung") 

SELECT 
NON EMPTY {[Measures].[Average Price]} 
ON COLUMNS, 
[Product Names].MEMBERS 
HAVING 
    measures.iPhoneInName >= 1 
    OR 
    measures.SamsungInName >= 1 
ON ROWS 
FROM [Price History] 

EDIT: Если вы хотите только те элементы, имена которых оканчиваются iPhone ИЛИ Samsung, то небольшое дополнение к коду:

(
    VBA!InStr([Product Name].CurrentMember.Name) + len("Samsung") + 1 
    = LEN([Product Name].CurrentMember.Name) 
    AND measures.SamsungInName >= 1 
) 
OR 
(
    VBA!InStr([Product Name].CurrentMember.Name) + len("iPhone") + 1 
    = LEN([Product Name].CurrentMember.Name) 
    AND measures.iPhoneInName >= 1 
) 

Mondrian версия

with member measures.iPhoneInName as 
    VBA!InStr([Product Name].CurrentMember.Name, "iPhone") 

    member measures.SamsungInName as 
    VBA!InStr([Product Name].CurrentMember.Name, "Samsung") 

    SELECT 
    NON EMPTY {[Measures].[Average Price]} 
    ON COLUMNS, 
    FILTER 
    (
    [Product Names].MEMBERS, 
     (
      VBA!InStr([Product Name].CurrentMember.Name) + len("Samsung") + 1 
      = LEN([Product Name].CurrentMember.Name) 
      AND measures.SamsungInName >= 1 
     ) 
     OR 
     (
      VBA!InStr([Product Name].CurrentMember.Name) + len("iPhone") + 1 
      = LEN([Product Name].CurrentMember.Name) 
      AND measures.iPhoneInName >= 1 
     ) 
    ) 
    ON ROWS 
    FROM [Price History] 
+0

привет спасибо за ответ, я попробовал ваш код, но он говорит: MondrianException: Mondrian Error: Синтаксическая ошибка в строке 11, столбец 1, токен 'HAVING' – MidhunKrishna

+0

Итак, 'MONDRIAN' не имеет' HAVING' clause! Подождите, добавьте еще один аромат. – SouravA

+0

@ Мидхун Кришна - добавлено. Пожалуйста, проверьте. – SouravA