Qlikview - вычислить и использовать вычисляемую переменную в скрипте

Как новый пользователь Qlikview, я ищу лучший способ создавать вычисляемые переменные и переменные, основанные на вычисленных переменных, в моих данных и использовать их на дисплеях. Мои данные подключены через ODBC.

Например, предположим, что мне нужна переменная Рейтинг, основанная на переменной «Риск» в моем наборе данных. Необработанные данные содержат переменную риска «L» или «H». Я хотел бы создать индикатор, например Risk_H, который равен 0 или 1 (если Risk = 'H'). Затем я хотел бы создать рейтинг типа «Рейтинг = 1 + Risk_H * 2». Могу ли я сделать все это в сценарии и иметь переменную Рейтинг в моем наборе данных?

Когда я пробую описанное выше, я могу создать переменную Risk_H, но тогда я не уверен, как ссылаться на нее в скрипте для вычисления переменной рейтинга. Я прочитал другие сообщения, в которых используется оператор загрузки (Расчетные поля Qlikview с помощью сценария загрузки), но безуспешно использовали вычисляемые переменные для создания новых переменных.

Пример кода (который работает):

SQL SELECT *,
case when (Risk = 'H') then 1
   else 0
   end as Risk_H
FROM [Data];

Как я могу создать Risk_H, чтобы использовать его в том же скрипте, как показано ниже? В других настройках я бы использовал что-то вроде «рассчитанный Risk_H» для обозначения этого.

SQL SELECT *,
case when (Risk = 'H') then 1
   else 0
   end as Risk_H,
(10 + Risk_H*2) as Rating   // Qlikview says it can't find Risk_H
FROM [Data];

Я пробовал создать Risk_H в сценарии загрузки, но Qlikview не распознает Risk_H в более позднем операторе SQL. Я также пробовал создать таблицу с помощью Risk_H и извлечь данные из этой таблицы. И на самом деле я пытаюсь создать 10+ индикаторов, а не один, поэтому вложенные операторы case - это не ответ.

РЕДАКТИРОВАТЬ: Мне сказали, что резидентные таблицы могут быть ответом на выполнение вычислений. Если вы можете предоставить синтаксис для этого, используя таблицы, подключенные через ODBC, это может ответить на вопрос.


person MusicAndMath    schedule 01.05.2014    source источник
comment
Как вы пытаетесь получить доступ к Risk_H? Если вы хотите получить значение из загруженного поля, используйте ›› let var = FieldValue ('Risk_H', 1);   -  person seebach    schedule 02.05.2014
comment
И помните, что то, что у вас в скрипте, должно быть только моделированием и очисткой данных, все вычисления выполняются в графическом интерфейсе.   -  person seebach    schedule 02.05.2014
comment
Спасибо за ответ. Я не обращаюсь к Risk_H в том смысле, что в моих исходных данных его нет, я создаю его там в скрипте. Когда вы говорите, что все вычисления выполняются в графическом интерфейсе, вы имеете в виду, что я не должен создавать переменную как комбинацию других переменных (то есть рейтинга) в скрипте? Похоже, что если я вычисляю Рейтинг в выражении, я должен поместить это выражение в любой объект, где я использую Рейтинг.   -  person MusicAndMath    schedule 02.05.2014
comment
Это проблема SQL, поскольку Risk_H не является столбцом, вам нужно использовать выражение case дважды.   -  person ralfbecher    schedule 05.05.2014
comment
Идея в том, что вы должны делать расчеты в графическом интерфейсе. Если вы выполняете одни и те же вычисления снова и снова, тогда будет полезно подготовить их в сценарии. Но если это сложно, когда это может быть сложно. Если вы используете его снова и снова, вы можете создать переменную, содержащую выражение, и поместить ее в свои диаграммы. Чтобы оценить переменную a в выражении, используйте = $ (переменная)   -  person seebach    schedule 09.05.2014


Ответы (1)


Похоже, что ваш второй оператор Select недействителен SQL, поэтому QlikView пожалуется, что не может найти Risk_H. Вы можете попробовать более сложный SQL-запрос с подзапросом, чтобы решить эту проблему, или вы можете использовать резидентную загрузку в QlikView следующим образом:

Source_Data:
SQL SELECT *,
case when (Risk = 'H') then 1
   else 0
   end as Risk_H
FROM [Data];

Calculated_Data:
NOCONCATENATE
LOAD
  *,
  (10 + Risk_H*2) as Rating
RESIDENT Source_Data;

DROP TABLE Source_Data;

Вы также упомянули, что у вас есть около 10 индикаторов, которые вы хотите использовать, поэтому я согласен, что выражение case, вероятно, не будет хорошей идеей. Вы также можете переместить эту часть в QlikView, если хотите использовать MAPPING загрузку и функцию ApplyMap следующим образом:

Indicator_Map:
MAPPING
LOAD
  *
INLINE [
  Risk, Value
  H,    1
  I,    2
  J,    3
];


Source_Data:
SQL SELECT *,
case when (Risk = 'H') then 1
   else 0
   end as Risk_H
FROM [Data];

Calculated_Data:
NOCONCATENATE
LOAD
  *,
  (10 + (ApplyMap('Indicator_Map',Risk, 0) * 2)) as Rating
RESIDENT Source_Data;

DROP TABLE Source_Data;

Я добавил пару дополнительных записей для ваших «индикаторов» риска, чтобы дать вам представление. Конечно, таблица не обязательно должна быть встроенной, она может быть получена из другого оператора SQL, другого файла и т. Д.

В приведенном выше примере происходит следующее: значение поля Risk передается в качестве параметра таблице сопоставления Indicator_Map, которая затем возвращает связанное значение. Если значение риска не найдено, возвращается 0 (третий параметр).

person i_saw_drones    schedule 07.05.2014