SSAS, работающие с несвязанными данными

Я пытаюсь сравнить данные прогноза с данными о продажах в кубе. Иногда у нас есть прогноз без фактической продажи, иногда у нас есть продажа без прогноза. Как просто показать 0%, если ни того, ни другого не существует? Это мой текущий код... Зеленые линии в порядке, потому что они показывают 0%, где одна из сумм не существует. Я хочу, чтобы он сделал то же самое для красных кружков.

CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS IIF([Measures].[Sales Line Amount TCUSD SF] <> 0 OR [Measures].[F Amount] <> 0, 1-ABS(DIVIDE(([Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]) , [Measures].[F Amount])), NULL),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast'  ; 

введите здесь описание изображения

РЕДАКТИРОВАТЬ - если оба значения меры не существуют, они оба будут нулевыми и не будут отображаться. Поэтому я бы не хотел, чтобы отображался процент, и я хочу выполнить расчет только в том случае, если одно из количеств не равно 0. Точность прогноза не должна показывать 100%, если количество f равно 0 и есть продажа, как показано в последнем img... это последнее, что нужно исправить...

введите здесь описание изображения


person jhowe    schedule 12.07.2016    source источник
comment
0,00% возвращается, когда 1-ABS(DIVIDE(([Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]) , [Measures].[F Amount])) возвращает 0. Пустое значение возвращается, когда встречается значение NULL. В чем проблема с этим?   -  person SouravA    schedule 12.07.2016
comment
@BeanFrog - он не может. Фактических данных 0.   -  person SouravA    schedule 12.07.2016
comment
Я не хочу пробелов. Если какая-либо из сумм не существует, я хочу показать 0%. Если я изменю NULL на 0, он заполнит все пустое пространство 0, а SSAS покажет все строки независимо от того, есть ли мера или нет.   -  person jhowe    schedule 12.07.2016
comment
окей, позвольте мне понять - вы хотите 0,00%, когда ни одно из значений не существует? Что, если оба значения существуют, но выражение 1-ABS(DIVIDE(([Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]) , [Measures].[F Amount])) возвращает 0?? В случае, если оба значения не существуют, что вы хотите?   -  person SouravA    schedule 12.07.2016
comment
Да, я хочу 0%, если либо не существует, либо не существует. Если оба существуют, и calc возвращает 0, это нормально. Если оба значения не существуют, отображается 0%   -  person jhowe    schedule 12.07.2016
comment
Затем вы можете продолжить предложения BeanFrog и изменить NULL на 0?   -  person SouravA    schedule 12.07.2016
comment
Извините, если оба значения не существуют, они оба будут нулевыми и не будут отображаться. Так что я бы тоже не хотел, чтобы процент отображался... извините... и я хочу сделать расчет только в том случае, если одна из величин не равна 0...   -  person jhowe    schedule 12.07.2016


Ответы (2)


Я предпочитаю безопасность ISEMPTY:

 CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS 
 IIF(
     NOT ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
     OR 
     NOT ISEMPTY([Measures].[F Amount])
   , 1-ABS(DIVIDE(
             [Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]
            ,[Measures].[F Amount]
            )
          )
   ,NULL
  ),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast' ; 

Чуть сложнее:

 CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS 
 IIF(
     ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
     AND 
     ISEMPTY([Measures].[F Amount])
   , NULL   //<<if both are empty
   , IIF(
       NOT ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
       OR 
       NOT ISEMPTY([Measures].[F Amount])
      ,1-ABS(
          DIVIDE(
            [Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]
            ,[Measures].[F Amount]
          )
         )
      ,0
      )
   ),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast' ; 
person whytheq    schedule 12.07.2016
comment
Привет, я не уверен, что вы правильно прочитали вопрос, я хочу, чтобы расчет работал, если одна из мер не равна 0. Я также не хочу заполнять все меры 0, так как он принесет все элементы независимо от того, используются они или нет. Все, что я хочу сделать, это просто добавить 0 для строк, где они пусты, как выделено на рис. - person jhowe; 12.07.2016
comment
когда вы говорите, все, что я хочу сделать, это просто добавить 0 для строк, где они пусты, вы на самом деле имеете в виду все, что я хочу сделать, это просто добавить 0 для строк, где они пусты или 0? - person whytheq; 12.07.2016
comment
привет, я думаю, что первый пример будет делать то, что я хочу, но я не могу проверить второй, есть ошибка перед вторым IIF, и в чем разница между NOT ISEMPTY и NONEMPTY? у меня были другие результаты... - person jhowe; 12.07.2016
comment
(@jhowe woops #1 - пропущена запятая для вложенных IIF) - person whytheq; 12.07.2016
comment
(@jhowe woops #2 + недостающая скобка для вложенных IIF) - person whytheq; 12.07.2016
comment
это близко, однако мы получаем 100% точность прогноза для нулевой суммы прогноза, что неверно. Он должен показывать 0%, если у нас есть прогноз 0 для большой продажи, это не очень хороший процент! ;) я добавил еще одну картинку - person jhowe; 12.07.2016
comment
Также @whytheq будет ли это работать в зависимости от выбранных мною размеров? если нет, как я могу приспособиться к этому? - person jhowe; 12.07.2016
comment
это так близко! пожалуйста, помогите мне закончить, это срочно... спасибо... - person jhowe; 12.07.2016

Я думаю, что ответ Whytheq сделал большую часть этого. Единственное, что, я думаю, вам нужно было проверить, больше ли оба значения нуля, чтобы вернуть оценку, и да, это будет работать с любым измерением, которое позволяет ваша модель SSAS. Что-то вроде следующего должно дать вам то, что вам нужно:

CREATE MEMBER CURRENTCUBE.[Measures].[Forecast Accuracy Amount %]
 AS 
 IIF(
     ISEMPTY([Measures].[Sales Line Amount TCUSD SF]) 
     AND 
     ISEMPTY([Measures].[F Amount])
   , NULL   //<<if both are empty
   , IIF( 
          //Getting here means, at minimum, one of the measures is not empty
          // Calculate the score only if both values are non equal to zero otherwise default to zero
          [Measures].[F Amount] <> 0 AND
          [Measures].[Sales Line Amount TCUSD SF] <>0 
      ,1-ABS(
          DIVIDE(
            [Measures].[F Amount] - [Measures].[Sales Line Amount TCUSD SF]
            ,[Measures].[F Amount]
          )
         )
      ,0
      )
   ),
FORMAT_STRING = "Percent", 
VISIBLE = 1 ,  ASSOCIATED_MEASURE_GROUP = 'Sales Forecast' ; 
person BICube    schedule 15.07.2016