Как я могу получить реляционные данные из другой таблицы и рассчитать среднее значение в Qlikview?

У меня есть отношения с 2 таблицами

Таблица 1 – Процесс

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

Таблица 2. История процесса

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

Здесь отношения Id (таблица процессов) и ProcessId (таблица истории процессов). Я хочу рассчитать среднее количество дней работы в сети для всех процессов.

Например:

nwd = 0;
count = 0;
if(Process.Id = ProcessHistory.ProcessId && ProcessHistory.Status='Status 3') {
  nwd += NWD(Process.CreatedOn, ProcessHistory.CreatedOn);
  count++;
}

Ожидаемый результат AverageNWD = nwd/count;

Как мы можем этого добиться?


person Rajaa    schedule 24.06.2019    source источник


Ответы (1)


В сценарии:

С помощью приведенного ниже скрипта в таблицу Process будет добавлено новое поле — NetWorkingDays. В этом поле будут указаны рабочие дни для каждого проекта (Id). С этим полем в наборе данных будет легче вычислить среднее значение в пользовательском интерфейсе (что-то вроде sum(NetWorkingDays) / count(distinct Id)

Process:
Load * Inline [
Id, Name    , CretedOn
1,  Process1, 2019-04-02
2,  Process2, 2019-04-05
3,  Process3, 2019-05-02
4,  Process4, 2019-06-02
];


ProcessHistory:
Load 
  Id        as ProcessHistoryId,
  ProcessId as Id,
  Status,
  CreatedOn as ProcessHistoryCreatedOn
;
Load * Inline [
Id, ProcessId, Status  , CreatedOn
1,  1,         Status 1, 2019-04-02
2,  1,         Status 2, 2019-04-02
3,  1,         Status 3, 2019-04-04
4,  2,         Status 1, 2019-04-05
5,  2,         Status 3, 2019-04-06
6,  3,         Status 1, 2019-05-07
7,  3,         Status 3, 2019-05-09
8,  4,         Status 1, 2019-06-02
9,  4,         Status 2, 2019-06-04
10, 4,         Status 3, 2019-06-07
];


TempTable:
Load
  Id,
  min(CretedOn) as MinCreatedOn
Resident
  Process
Group By
  Id
;

join (TempTable)

Load
  Id,
  max(ProcessHistoryCreatedOn) as MaxCreatedOn
Resident
  ProcessHistory
Where
  Status = 'Status 3'
Group By
  Id
;


NetWorkingDaysData:
Load
  Id,
  NetWorkDays(MinCreatedOn, MaxCreatedOn) as NetWorkingDays 
Resident
  TempTable
;

Drop Table TempTable;

Последняя часть скрипта (изнутри):

Создайте временную таблицу для вычисления min(CreatedOn) из таблицы Process и max(ProcessHistoryCreatedOn) из таблицы ProcessHistory. ProcessHistory также фильтруется, чтобы включить только записи, где Status = 'Status 3' (обе таблицы агрегированы по Id)

TempTable:
Load
  Id,
  min(CretedOn) as MinCreatedOn
Resident
  Process
Group By
  Id
;

join (TempTable)

Load
  Id,
  max(ProcessHistoryCreatedOn) as MaxCreatedOn
Resident
  ProcessHistory
Where
  Status = 'Status 3'
Group By
  Id
;

После создания временной таблицы мы можем создать окончательную таблицу, в которой мы будем рассчитывать количество чистых рабочих дней, используя NetWorkDays. В таблице NetWorkingDaysData будет всего два поля — Id и NetWorkingDays

NetWorkingDaysData:
Load
  Id,
  NetWorkDays(MinCreatedOn, MaxCreatedOn) as NetWorkingDays 
Resident
  TempTable
;

И последний шаг — удалить TempTable — он больше не нужен.

В пользовательском интерфейсе:

Тот же результат может быть достигнут в пользовательском интерфейсе с помощью приведенного ниже выражения. Просто имейте в виду, что подход с пользовательским интерфейсом может привести к более высокому потреблению ресурсов! Поскольку все расчеты выполняются на лету (зависит от того, насколько велик ваш набор данных).

avg(
  Aggr(
    NetWorkDays( min(ProcessHistoryCreatedOn) , max( {< Status = {'Status 3'} >} ProcessHistoryCreatedOn) )
  , Id)
)
person Stefan Stoichev    schedule 24.06.2019
comment
Стефан, спасибо за ценный ответ. Попробую это и сообщу вам. У меня есть вопрос min(ProcessHistoryCreatedOn) как MinCreatedOn, max(ProcessHistoryCreatedOn) как MaxCreatedOn — оба берутся из таблицы ProcessHistory. Но мое требование: Min нужно взять из Process.CreatedOn. Также необходимо взять ProcessHistory.CreatedOn, когда Status='Status 3'. Так что будет полезнее, если вы отредактируете свой ответ соответствующим образом. - person Rajaa; 24.06.2019
comment
@Prince обновил ответ, включив в него ваш комментарий. Из любопытства... почему Min CreatedOn надо брать из таблицы Process? - person Stefan Stoichev; 24.06.2019
comment
@Stephen Stoichev, На самом деле я хочу взять NWD между записью в таблице процессов и записью «Статус 3» в таблице ProcessHistory (запись «Статус 1» в истории процессов может быть другой датой, чем запись в таблице процессов. - person Rajaa; 26.06.2019