2015-01-27 3 views
1

Ι Я пытаюсь сделать вычисляемый атрибут измерения с помощью именованного набора, но я не очень хорошо знаком с mdx. Я хочу, чтобы атрибут содержал описание, основанное на значениях 4 разных атрибутов. Я попытался использовать следующий код, но должен иметь недопустимый синтаксис (дает ошибку).Именованный набор с использованием iif в mdx

create set [pet types] 
as 

iif([Vw Cube Customer Dim].[Has Pet].&[Yes], 
    iif([Vw Cube Customer Dim].[Has Cat].&[Yes], 
     iif([Vw Cube Customer Dim].[Has Dog].&[Yes], 
      iif([Vw Cube Customer Dim].[Has Other Pet].&[Yes], 
       "Multiple Pets","Cat and Dog"), 
     "Cat"), 
    iif([Vw Cube Customer Dim].[Has Dog].&[Yes] 
     and [Vw Cube Customer Dim].[Has Pet].&[Yes], 
     "Dog and other Pet","Dog")), 
"No Pet") 
+1

Странные 'mdx' какие ссылки вы используете, чтобы придумать это? Читаемость нуждается в некоторой работе. Одна очевидная проблема заключается в том, что вы пытаетесь создать «Мера, а не набор». Набор - это группа членов - ваш скрипт возвращает строку на основе условий - так что это мера. – whytheq

+0

Я использовал различные ссылки и свое воображение. В частности, у меня был сценарий dax для расчетного столбца, и я попытался реализовать его в mdx. Я понимаю, что вы имеете в виду о моем недоразумении. Итак, как я могу сделать вычисляемый столбец с этой логикой? Именованный расчёт на DSV не помогает, потому что оператор case не поддерживает наборы с общими членами (пересекается) –

+0

Я использую 'MDX' для запроса кубов - я не вмешиваюсь в сценарий куба, поэтому, возможно, это не поможет. Если вы можете абстрагировать свою проблему с нормальным сценарием MDX ('WITH ... SELECT ... FROM ... WHERE'), то я могу помочь. – whytheq

ответ

2

Для улучшения читаемости (но это уменьшает масштабируемость) Я предпочел бы использовать матрицу состояний с коэффициентом члена каждой Иерархии: Pets Matrix

чем добавить несколько членов с их весами:

CREATE MEMBER CURRENTCUBE.[Measures].[Has Pet Value] as 
IIF([Vw Cube Customer Dim].[Has Pet].CurrentMember 
IS [Vw Cube Customer Dim].[Has Pet].&[Yes],8,0); 

CREATE MEMBER CURRENTCUBE.[Measures].[Has Cat Value] as 
IIF([Vw Cube Customer Dim].[Has Cat].CurrentMember 
IS [Vw Cube Customer Dim].[Has Cat].&[Yes],4,0); 

CREATE MEMBER CURRENTCUBE.[Measures].[Has Dog Value] as 
IIF([Vw Cube Customer Dim].[Has Dog].CurrentMember 
IS [Vw Cube Customer Dim].[Has Dog].&[Yes],2,0); 

CREATE MEMBER CURRENTCUBE.[Measures].[Has Other Pet Value] as 
IIF([Vw Cube Customer Dim].[Has Other Pet].CurrentMember 
IS [Vw Cube Customer Dim].[Has Other Pet].&[Yes],1,0); 

И последние два члена: 1) для поддержки, 2) для получения желаемого результата.

CREATE MEMBER CURRENTCUBE.[Measures].[Pet Types Value] as 
([Measures].[Has Pet Value] 
+[Measures].[Has Cat Value] 
+[Measures].[Has Dog Value] 
+[Measures].[Has Other Pet Value]); 

CREATE MEMBER CURRENTCUBE.[Measures].[Pet Types] as 
case [Measures].[Pet Types Value] 
    when 15 then "Multiple Pets" 
    when 14 then "Cat and Dog" 
    when 13 then "Cat and other Pet" 
    when 12 then "Cat" 
    when 11 then "Dog and other Pet" 
    when 10 then "Dog" 
    else "No Pet" end; 

Добавление другого измерения/иерархии для анализа (скажем, [Vw Cube Customer Dim].[Has Bird].&[Yes]) может вызвать добавления нового члена со следующим весом (16 в этом примере) и пересчитать [Pet Types Value] и [Pet Types].

+0

upp-ed Мне это нравится (особенно выбранные веса) – whytheq

+0

@whytheq, я также думал о повышении масштабируемости и автоматизации этого решения. Smth like: добавьте таблицу с идентификационным столбцом и желательными членами (кошка, собака и т. Д.), Чем вычислите вес в DSV как 2^ID и добавьте его как свойство. Наконец, используйте эти свойства вместо добавления значений Has_Animal_Value. Но ручное редактирование [Measures]. [Pet Types] неизбежно. –

+0

Трюк с суммой был очень полезен. Я использовал его для создания атрибута измерения, в котором я был нужен. Спасибо –

0

Не уверен в сценариях куба, поскольку я не играю с теми, но делаю что-то вроде Google.

Пожалуйста, проверьте без AND, поскольку я думаю, что это также вызовет ошибку.

Также вместо «Нет домашних животных» я предлагаю изменить это на нуль, чтобы мера стала разреженной, так как это одна из точек olap.

CREATE MEMBER CURRENTCUBE.Measures.PetType 
AS 
' 
iif([Vw Cube Customer Dim].[Has Pet].CurrentMember IS [Vw Cube Customer Dim].[Has Pet].&[Yes], 
    iif([Vw Cube Customer Dim].[Has Cat].CurrentMember IS [Vw Cube Customer Dim].[Has Cat].&[Yes], 
     iif([Vw Cube Customer Dim].[Has Dog].CurrentMember IS [Vw Cube Customer Dim].[Has Dog].&[Yes], 
      iif([Vw Cube Customer Dim].[Has Other Pet].CurrentMember IS [Vw Cube Customer Dim].[Has Other Pet].&[Yes], 
       "Multiple Pets","Cat and Dog"), 
     "Cat"), 
    iif(([Vw Cube Customer Dim].[Has Dog].CurrentMember IS [Vw Cube Customer Dim].[Has Dog].&[Yes]) 
     AND ([Vw Cube Customer Dim].[Has Pet].CurrentMember IS [Vw Cube Customer Dim].[Has Pet].&[Yes]), 
     "Dog and other Pet","Dog")), 
"No Pet") 
'