Как получить реляционные данные из другой таблицы и рассчитать среднее значение в Qlikview? - PullRequest
0 голосов
/ 24 июня 2019

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

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

enter image description here

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

enter image description here

Здесь взаимосвязь 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;

Как этого достичь?

1 Ответ

2 голосов
/ 24 июня 2019

В сценарии:

Используя скрипт ниже, вы добавите новое поле в таблицу 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)
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...