如何从另一个 table 获取关系数据并在 Qlikview 中计算平均值?

How can get I get relational data from another table and calculate the average in Qlikview?

我和 2 tables

有关系

Table 1 - 进程

Table 2 - 进程历史记录

这里的关系是Id(Processtable)和ProcessId(Process historytable) 我想计算所有进程的平均联网天数。

例如:

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

预期结果 AverageNWD = nwd/count;

我们怎样才能做到这一点?

在脚本中:

使用下面的脚本将向 Process table - NetWorkingDays 添加一个新字段。该字段将包含每个项目的工作日 (Id)。在数据集中使用此字段将更容易计算 UI 中的平均值(类似于 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;

脚本的最后一部分(从里到外):

创建临时 table 以从 Process table 计算 min(CreatedOn) 并从 ProcessHistory table 计算 max(ProcessHistoryCreatedOn)ProcessHistory 也被过滤为仅包含 Status = 'Status 3' 的记录(两个 table 都按 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
;

创建临时 table 后,我们可以创建最终的 table,我们将在其中使用 NetWorkDays 函数计算净工作日数。 NetWorkingDaysData table 将只有两个字段 - IdNetWorkingDays

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

最后一步是删除 TempTable - 它不再需要

中UI:

使用下面的表达式在 UI 中可以得到相同的结果。 请记住,UI 方法可能会导致更高的资源消耗! 因为所有计算都是 on-the-fly(取决于您的数据集有多大)

avg(
  Aggr(
    NetWorkDays( min(ProcessHistoryCreatedOn) , max( {< Status = {'Status 3'} >} ProcessHistoryCreatedOn) )
  , Id)
)