首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何从另一个表中获取关系数据并在Qlikview中计算平均值?

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

Stack Overflow用户
提问于 2019-06-24 22:03:50
回答 1查看 201关注 0票数 0

我和2个表有关系

表1-流程

表2-进程历史记录

这里的关系是Id(进程表)和ProcessId(进程历史表),我想要计算所有进程的平均联网天数。

例如:

代码语言:javascript
复制
nwd = 0;
count = 0;
if(Process.Id = ProcessHistory.ProcessId && ProcessHistory.Status='Status 3') {
  nwd += NWD(Process.CreatedOn, ProcessHistory.CreatedOn);
  count++;
}

预期结果AverageNWD =nwd/计数;

我们如何才能做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-24 22:31:19

脚本中的

使用下面的脚本将向Process表中添加一个新字段- NetWorkingDays。此字段将包含每个项目的工作日(Id)。在数据集中使用此字段将更易于在UI中计算平均值(类似于sum(NetWorkingDays) / count(distinct Id)

代码语言:javascript
复制
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;

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

创建临时表,从Process表计算min(CreatedOn),从ProcessHistory表计算max(ProcessHistoryCreatedOn)。还会对ProcessHistory进行过滤,以仅包括其中包含Status = 'Status 3'的记录(两个表都是按Id聚合的)

代码语言:javascript
复制
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表将只有两个字段- IdNetWorkingDays

代码语言:javascript
复制
NetWorkingDaysData:
Load
  Id,
  NetWorkDays(MinCreatedOn, MaxCreatedOn) as NetWorkingDays 
Resident
  TempTable
;

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

UI中的

使用下面的表达式可以在UI中实现相同的结果。只需记住UI方法可能会导致更高的资源消耗!因为所有的计算都是动态的(取决于你的数据集有多大)

代码语言:javascript
复制
avg(
  Aggr(
    NetWorkDays( min(ProcessHistoryCreatedOn) , max( {< Status = {'Status 3'} >} ProcessHistoryCreatedOn) )
  , Id)
)
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56738303

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档