如何从另一个 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 将只有两个字段 - Id
和 NetWorkingDays
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)
)
我和 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 将只有两个字段 - Id
和 NetWorkingDays
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)
)